《Flask 入门教程》第 4 章:使用静态文件

静态文件(static files)和咱们的模板概念相反,指的是内容不须要动态生成的文件。好比图片、CSS 文件和 JavaScript 脚本等。css

在 Flask 中,咱们须要建立一个 static 文件夹来保存静态文件,它应该和程序模块、templates 文件夹在同一目录层级,因此咱们在项目根目录建立它:html

$ mkdir static复制代码

生成静态文件 URL

在 HTML 文件里,引入这些静态文件须要给出资源所在的 URL。为了更加灵活,这些文件的 URL 能够经过 Flask 提供的 url_for() 函数来生成。前端

在第 2 章的最后,咱们学习过 url_for() 函数的用法,传入端点值(视图函数的名称)和参数,它会返回对应的 URL。对于静态文件,须要传入的端点值是 static,同时使用filename 参数来传入相对于 static 文件夹的文件路径。git

假如咱们在 static 文件夹的根目录下面放了一个 foo.jpg 文件,下面的调用能够获取它的 URL:github

<img src="{{ url_for('static', filename='foo.jpg') }}">复制代码

花括号部分的调用会返回 /static/foo.jpgflask

提示 在 Python 脚本里,url_for() 函数须要从 flask 包中导入,而在模板中则能够直接使用,由于 Flask 把一些经常使用的函数和对象添加到了模板上下文(环境)里。bootstrap

添加 Favicon

Favicon(favourite icon) 是显示在标签页和书签栏的网站头像。你须要准备一个 ICO、PNG 或 GIF 格式的图片,大小通常为 16×1六、32×3二、48×48 或 64×64 像素。把这个图片放到 static 目录下,而后像下面这样在 HTML 模板里引入它:浏览器

templates/index.html:引入 Favicon前端框架

<head>
    ...
    <link rel="icon" href="{{ url_for('static', filename='favicon.ico') }}">
</head>复制代码

保存后刷新页面,便可在浏览器标签页上看到这个图片。框架

添加图片

为了让页面不那么单调,咱们来添加两个图片:一个是显示在页面标题旁边的头像,另外一个是显示在页面底部的龙猫动图。咱们在 static 目录下面建立一个子文件夹 images,把这两个图片都放到这个文件夹里:

$ cd static
$ mkdir images复制代码

建立子文件夹并非必须的,这里只是为了更好的组织同类文件。一样的,若是你有多个 CSS 文件,也能够建立一个 css 文件夹来组织他们。下面咱们在页面模板中添加这两个图片,注意填写正确的文件路径:

templates/index.html:添加图片

<h2>
    <img alt="Avatar" src="{{ url_for('static', filename='images/avatar.png') }}">
    {{ name }}'s Watchlist
</h2>
...
<img alt="Walking Totoro" src="{{ url_for('static', filename='images/totoro.gif') }}">复制代码

提示 这两张图片你能够本身替换为任意的图片(注意更新文件名),也能够在示例程序的 GitHub 仓库下载。

添加 CSS

虽然添加了图片,但页面仍是很是简陋,由于咱们尚未添加 CSS 定义。下面在 static 目录下建立一个 CSS 文件 style.css,内容以下:

static/style.css:定义页面样式

/* 页面总体 */
body {
    margin: auto;
    max-width: 580px;
    font-size: 14px;
    font-family: Helvetica, Arial, sans-serif;
}

/* 页脚 */
footer {
    color: #888;
    margin-top: 15px;
    text-align: center;
    padding: 10px;
}

/* 头像 */
.avatar {
    width: 40px;
}

/* 电影列表 */
.movie-list {
    list-style-type: none;
    padding: 0;
    margin-bottom: 10px;
    box-shadow: 0 2px 5px 0 rgba(0, 0, 0, 0.16), 0 2px 10px 0 rgba(0, 0, 0, 0.12);
}

.movie-list li {
    padding: 12px 24px;
    border-bottom: 1px solid #ddd;
}

.movie-list li:last-child {
    border-bottom:none;
}

.movie-list li:hover {
    background-color: #f8f9fa;
}

/* 龙猫图片 */
.totoro {
    display: block;
    margin: 0 auto;
    height: 100px;
}复制代码

接着在页面的 <head> 标签内引入这个 CSS 文件:

templates/index.html:引入 CSS 文件

<head>
    ...
    <link rel="stylesheet" href="{{ url_for('static', filename='style.css') }}" type="text/css">
</head>复制代码

最后要为对应的元素设置 class 属性值,以便和对应的 CSS 定义关联起来:

templates/index.html:添加 class 属性

<h2>
    <img alt="Avatar" class="avatar" src="{{ url_for('static', filename='images/avatar.png') }}">
    {{ name }}'s Watchlist
</h2>
...
<ul class="movie-list">
    ...
</ul>
<img alt="Walking Totoro" class="totoro" src="{{ url_for('static', filename='images/totoro.gif') }}">复制代码

最终的页面以下图所示(你能够自由修改 CSS 定义,我已经尽力了):



本章小结

主页如今基本成型了,接下来咱们会慢慢完成程序的功能。结束前,让咱们提交代码:

$ git add .
$ git commit -m "Add static files"
$ git push复制代码

提示 你能够在 GitHub 上查看本书示例程序的对应 commit:887b471(图片的 CSS 定义后续有一些调整)。

进阶提示

  • 若是你对 CSS 很头疼,能够借助前端框架来完善页面样式,好比 BootstrapSemantic-UIFoundation 等。它们提供了大量的 CSS 定义和动态效果,使用起来很是简单。
  • 扩展 Bootstrap-Flask 能够简化在 Flask 项目里使用 Bootstrap 4 的步骤。
相关文章
相关标签/搜索