【Python】flask笔记<1> 变量规则,URL 构建, http方法,静态文件

参考网址:https://dormousehole.readthedocs.io/en/latest/quickstart.html#id6

自留学习用,加上了一些自己认为是重点的总结。

变量规则

通过把 URL 的一部分标记为 <variable_name> 就可以在 URL 中添加变量。标记的 部分会作为关键字参数传递给函数。通过使用 <converter:variable_name> ,可 选择加上一个转换器,为变量指定规则。
转换器只接受目标类型,否则不会出现正常的结果:

转换器类型:

类型接受的串
string(缺省值)接受任何不包含斜杠的文本
int接受正整数
float接受正浮点数
path类似 string ,但可以包含斜杠
uuid接受 UUID 字符串

唯一的 URL / 重定向行为

以下两条规则的不同之处在于是否使用尾部的斜杠。:

@app.route('/projects/')
def projects():
    return 'The project page'

@app.route('/about')
def about():
    return 'The about page'

projects 的 URL 是中规中矩的,尾部有一个斜杠,看起来就如同一个文件夹。 访问一个没有斜杠结尾的 URL 时 Flask 会自动进行重定向,帮你在尾部加上一个斜杠。

about 的 URL 没有尾部斜杠,因此其行为表现与一个文件类似。如果访问这个 URL 时添加了尾部斜杠就会得到一个 404 错误。

这样可以保持 URL 唯一,并帮助 搜索引擎避免重复索引同一页面。就算用户没有加斜杠(忘记了),也会定位到正确位置上

URL 构建

url_for() 函数用于构建指定函数的 URL。它把函数名称作为第一个 参数。它可以接受任意个关键字参数,每个关键字参数对应 URL 中的变量。未知变量 将添加到 URL 中作为查询参数。

为什么不在把 URL 写死在模板中,而要使用反转函数 url_for() 动态构建?

  1. 反转通常比硬编码 URL 的描述性更好。
  2. 你可以只在一个地方改变 URL ,而不用到处乱找。
  3. URL 创建会为你处理特殊字符的转义和 Unicode 数据,比较直观。
  4. 生产的路径总是绝对路径,可以避免相对路径产生副作用。
  5. 如果你的应用是放在 URL 根路径之外的地方(如在 /myapplication 中,不在 / 中), url_for() 会为你妥善处理。

使用本地环境进行测试

在测试时会遇到由于没有请求对象而导致依赖于请求的代码会突然崩溃的情况。对策是自己创建 一个请求对象并绑定到环境。最简单的单元测试解决方案是使用 test_request_context() 环境管理器。通过使用 with 语句 可以绑定一个测试请求,以便于交互。

from flask import request
with app.test_request_context('/hello', method='POST'):
    # now you can do something with the request until the
    # end of the with block, such as basic assertions:
    # 现在你可以做一些请求直到块结束,比如基本的assert,打印print等等
    assert request.path == '/hello'
    assert request.method == 'POST'
    print(url_for('index'))

另一种方式是把整个 WSGI 环境传递给 request_context() 方法:

from flask import request

with app.request_context(environ):
    assert request.method == 'POST'

http方法:

缺省情况下,一个路由只回应 GET 请求。 可以使用 route() 装饰器的 methods 参数来处理不同的 HTTP 方法:

from flask import request

@app.route('/login', methods=['GET', 'POST'])
def login():
    if request.method == 'POST': # 规定了路由回应post请求
        return do_the_login()
    else:
        return show_the_login_form()

使用了 GET 方法, Flask 会自动添加 HEAD 方法支持,并且同时还会 按照 HTTP RFC 来处理 HEAD 请求。同样, OPTIONS 也会自动实现。

options出现的情况:
1、获取目的资源所支持的通信方式
黑客有可能经常用到这个;在响应报文中包含一个 Allow 首部字段,该字段的值表明了服务器支持的所有 HTTP 方法,如下:
HTTP/1.1 200 OK
Allow: OPTIONS, GET, HEAD, POST
Cache-Control: max-age=604800
Date: Thu, 13 Oct 2016 11:45:00 GMT
Expires: Thu, 20 Oct 2016 11:45:00 GMT
Server: EOS (lax004/2813)
x-ec-custom-error: 1
Content-Length: 0
2、跨域请求中,options请求是浏览器自发起的preflight request(预检请求),以检测实际请求是否可以被浏览器接受。

静态文件

动态的 web 应用也需要静态文件,一般是 CSS 和 JavaScript 文件。Flask 也能做好这项工作。只要在你的包或模块旁边创建一个名为 static 的文件夹就行了。 静态文件位于应用的 /static 中。

url_for(‘static’, filename=‘style.css’)

这个静态文件在文件系统中的位置应该是 static/style.css 。

渲染模板

用到了jinja2模板引擎。使用 render_template() 方法可以渲染模板,你只要提供模板名称和需要 作为参数传递给模板的变量就行了。下面是一个简单的模板渲染例子:

from flask import render_template

@app.route('/test/')
@app.route('/test/<name>')
def hello(name=None):
    return render_template('hello.html', name=name)

Flask 会在 templates 文件夹内寻找模板。因此,如果你的应用是一个模块, 那么模板文件夹应该在模块旁边;如果是一个包,那么就应该在包里面:
情形 1 : 一个模块:

/application.py
/templates
    /hello.html

情形 2 : 一个包:

/application
    /__init__.py
    /templates
        /hello.html

在这里插入图片描述
hello.html

<!doctype html>
<title>Hello from Flask</title>
{% if name %}
  <h1>Hello {{ name }}!</h1> # name由参数决定
{% else %}
  <h1>Hello, World!</h1>
{% endif %}

总结:

下面的代码用到了上面的知识:

from flask import Flask
from flask import render_template
app=Flask(__name__)
@app.route("/")
def index():
    return  "index"

@app.route('/hello/')
@app.route('/hello/<name>')#任何有/hello/的路径都可以显示hello.html,比如http://127.0.0.1:5000/hello/123,显示hello 123
def hello(name=None):
    return render_template('hello.html', name=name)

@app.route('/usr/<username>')
def show_user_profile(username):
    return 'User %s'% username


@app.route('/post/<float:post_id>') # 如果不是数字类型,就不会请求成功
def show_post(post_id):
    print(post_id)
    return 'post id :%s'% post_id

if __name__=="__main__":
    app.debug = True
    app.run()
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值