flask入门(二)
1.路由
使用route()装饰器把一个函数绑定到URL上,可以动态的构造URL的特定部分,也可在一个函数上附加多个规则。
@app.route('/')
def index():
return 'Index Page'@app.route('/hello')
def hello():
return 'Hello World'
2.变量规则 用
给URL添加变量部分,这部分作为命名参数传递到函数。规则可用
指定转换器@app.route('/user/')
def show_user_profile(username):
return 'User %s' %username@app.route('/post/')
def show_post(post_id):
return 'Post %d' %post_id
转换器 | 接受参数 |
---|---|
string | 接受任何没有斜杠“/”文本(默认) |
int | 整型 |
float | 同int一样,但是还包括浮点数 |
path | 和string相似,但也接受斜杠“/” |
uuid | 只接受UUID字符串 |
any | 可以制定多种路径,但是需要传递参数 |
@app.route('//')
访问/a/和/b/都符合这个规则,page_name对应的就是a或b。3.唯一URL和重定向行为 以下两个为例:
@app.route('/projects/')
def projects():
return 'The project page'@app.route('/about')
def about():
return 'The about page'
它们结尾斜线的使用在 URL 定义 中不同。 第一种情况中,指向 projects 的规范 URL 尾端有一个斜线。这种感觉很像在文件系统中的文件夹。访问一个结尾不带斜线的 URL 会被 Flask 重定向到带斜线的规范 URL 去。
然而,第二种情况的 URL 结尾不带斜线,类似 UNIX-like 系统下的文件的路径名。访问结尾带斜线的 URL 会产生一个 404 “Not Found” 错误。
4.构造URL
url_for()
可以给指定的函数构造URL。接受函数名作为第一个参数,也接受对应URL规则的变量部分的命名参数。未知变量会添加到URL末尾作为查询参数。
文章图片
图片发自App
环境局部变量
一段依赖请求对象的代码,因没有请求对象而无法运行。
解决方案:自行创建一个请求对象,并绑定到环境中。单元测试中最简单的使用
test_request_context()
环境管理器
from flask import request
with app.test_request_context('/hello',method='POST'):
assert request.method=='POST'
assert request.path=='/hello'
另外一种可能,传递整个WSGI环境request_context()方法
from flask import request
with app.request_context(environ):
assert request.method=='POST'
5.重定向和错误
redirect(location,code=301)
函数把用户重新定向到其他地方,和url_for()
结合使用。abort()
放弃请求并返回错误码from flask import abort,url_for,redirect@app.route('/')
def index():
retuen redirect(url_for('login'))@app.route('/login')
def login():
abort(401)
this_is_never_execute()
定制错误页面,使用
errorhandler()
装饰器from flask import render_template
@app.errorhandler(404)
def page_not_found(error):
return render_template('page_not_found.html'),404
实例
from flask import Flask,request,redirect,abort,url_for,render_templateapp=Flask(__name__)
app.config.from_object("config")@app.route('/people/')
def people():
name=request.args.get("name")
if not name:
return redirect(url_for("login"))
user_agent=request.headers.get("User-Agent")
return "Name:{0};
UA:{1}".format(name,user_agent)@app.route('/login/',methods=["GET","POST"])
def login():
if request.method=="POST":
user_id=request.form.get("user_id")
return "User:{} login".format(user_id)
else:
return render_template('login.html')@app.route('/secret/')
def secret():
abort(401)
print('This is never execute!')if __name__ == '__main__':
app.run()
【flask入门(二)】login.html
登录 - 锐客网
推荐阅读
- EffectiveObjective-C2.0|EffectiveObjective-C2.0 笔记 - 第二部分
- 遇到一哭二闹三打滚的孩子,怎么办┃山伯教育
- 赢在人生六项精进二阶Day3复盘
- 2019年12月24日
- 陇上秋二|陇上秋二 罗敷媚
- 一百二十三夜,请嫁给我
- 迷失的世界(二十七)
- 我要我们在一起(二)
- 基于|基于 antd 风格的 element-table + pagination 的二次封装
- (二)ES6第一节变量(let|(二)ES6第一节变量(let,const)