学习 Flask
- 函数
- 模块
- 类 与 实例
- 装饰器
http://www.bjhee.com/flask-4.html
https://dormousehole.readthedocs.io/en/latest/quickstart.html#quickstart%EF%BC%9A80
首先创建一个 flask
项目
保存名字不能为 flask.py
服务器外部可见 --host=0.0.0.0
app.run(host='0.0.0.0', port=8888, debug=True)
使用 route()
装饰器来把函数绑定到URL
@app.route('/')
def index():
return 'Index Page'
@app.route('/hello')
def hello():
return 'Hello, World'
URL
中添加变量
通过把 URL 的一部分标记为 <variable_name>
就可以在 URL
中添加变量。
标记的部分会作为关键字参数传递给函数。通过使用 <converter:variable_name>
,
可以选择性的加上一个转换器,为变量指定规则。
@app.route('/user/<username>')
def show_user_profile(username):
# show the user profile for that user
return 'User %s' % escape(username)
@app.route('/post/<int:post_id>')
def show_post(post_id):
# show the post with the given id, the id is an integer
return 'Post %d' % post_id
@app.route('/path/<path:subpath>')
def show_subpath(subpath):
# show the subpath after /path/
return 'Subpath %s' % escape(subpath)
类型 | 嘿嘿 |
---|---|
string |
(缺省值) 接受任何不包含斜杠的文本 |
int |
接受正整数 |
float |
接受正浮点数 |
path |
类似 string ,但可以包含斜杠 |
uuid |
接受 UUID 字符串 |
UUID 是 通用唯一识别码(Universally Unique Identifier)的缩写
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
中作为查询参数。
from flask import Flask, escape, url_for
app = Flask(__name__)
@app.route('/')
def index():
return 'index'
@app.route('/login')
def login():
return 'login'
@app.route('/user/<username>')
def profile(username):
return '{}\'s profile'.format(escape(username))
Flask提供了url_for()
方法来快速获取及构建URL,方法的第一个参数指向函数名(加过@app.route
注解的函数),后续的参数对应于要构建的URL变量。下面是几个例子:
url_for('login') # 返回/login
url_for('login', id='1') # 将id作为URL参数,返回/login?id=1
url_for('hello', name='man') # 适配hello函数的name参数,返回/hello/man
url_for('static', filename='style.css') # 静态文件地址,返回/static/style.css
多 URL 的路由
@app.route('/')
@app.route('/hello')
@app.route('/hello/<name>')
def hello(name=None):
if name is None:
name = 'World'
return 'Hello %s' % name
渲染模板
使用 render_template()
方法可以渲染模板,你只要提供模板名称和需要作为参数传递给模板的变量就行了。下面是一个简单的模板渲染例子:
from flask import render_template
@app.route('/hello/')
@app.route('/hello/<name>')
def hello(name=None):
return render_template('hello.html', name=name)
模板示例:
<!doctype html>
<title>Hello from Flask</title>
{% if name %}
<h1>Hello {{ name }}!</h1>
{% else %}
<h1>Hello, World!</h1>
{% endif %}
模板继承
一般我们的网站虽然页面多,但是很多部分是重用的,比如页首,页脚,导航栏之类的。对于每个页面,都要写这些代码,很麻烦。Flask的Jinja2模板支持模板继承功能,省去了这些重复代码。让我们基于上面的例子,在”templates”目录下,创建一个名为”layout.html”的模板:
<!doctype html>
<title>Hello Sample</title>
<link rel="stylesheet" type="text/css" href="{{ url_for('static', filename='style.css') }}">
<div class="page">
{% block body %}
{% endblock %}
</div>
再修改之前的hello.html
,把原来的代码定义在{% block body %}
中,并在代码一开始”继承”上面的layout.html
:
{% extends "layout.html" %}
{% block body %}
{% if name %}
<h1>Hello {{ name }}!</h1>
{% else %}
<h1>Hello World!</h1>
{% endif %}
{% endblock %}
打开浏览器,再看下http://localhost:5000/hello/man页面的源码。
<!doctype html>
<title>Hello Sample</title>
<link rel="stylesheet" type="text/css" href="/static/style.css">
<div class="page">
<h1>Hello man!</h1>
</div>
你会发现,虽然render_template()
加载了hello.html
模板,但是layout.html
的内容也一起被加载了。而且hello.html
中的内容被放置在layout.html
中{% block body %}
的位置上。形象的说,就是hello.html
继承了layout.html
。
请求对象
@app.route('/login', methods=['POST', 'GET'])
def login():
error = None
if request.method == 'POST':
if valid_login(request.form['username'],
request.form['password']):
return log_the_user_in(request.form['username'])
else:
error = 'Invalid username/password'
# the code below is executed if the request method
# was GET or the credentials were invalid
return render_template('login.html', error=error)
要操作 URL (如 ?key=value
)中提交的参数可以使用 args
属性:
searchword = request.args.get('key', '')
引入flask包中的request对象,就可以直接在请求函数中直接使用该对象了。让我们改进下第二篇中的login()方法:
from flask import request
@app.route('/login', methods=['POST', 'GET'])
def login():
if request.method == 'POST':
if request.form['user'] == 'admin':
return 'Admin login successfully!'
else:
return 'No such user!'
title = request.args.get('title', 'Default')
return render_template('login.html', title=title)
在第三篇的templates目录下,添加”login.html”文件
{% extends "layout.html" %}
{% block body %}
<form name="login" action="/login" method="post">
Hello {{ title }}, please login by:
<input type="text" name="user" />
</form>
{% endblock %}
定制404
缺省情况下每种出错代码都会对应显示一个黑白的出错页面。使用 errorhandler()
装饰器可以定制出错页面:
from flask import render_template
@app.errorhandler(404)
def page_not_found(error):
return render_template('page_not_found.html'), 404
HTTP 请求
from flask import request
@app.route('/login', methods=['GET', 'POST'])
def login():
if request.method == 'POST':
return 'This is a POST request'
else:
return 'This is a GET request'
网友评论