本文为flask学习记录
环境安装
安装virtualenv
virtualenv是一个虚拟的Python环境构建器。它可以帮助用户并行创建多个Python环境。 因此,它可以避免不同版本的库之间的兼容性问题。
pip install virtualenv
安装后,将在文件夹中创建新的虚拟环境。
1 2 3 4
| cd D: mkdir myproject cd myproject virtualenv venv
|
要在 Windows 上激活相应的环境,可以使用以下命令:
venv\scripts\activate
安装好后
可在这个环境中安装Flask:
pip install Flask
也可直接安装
大致框架
来源
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| flask-demo/ ├ run.py # 应用启动程序 ├ config.py # 环境配置 ├ requirements.txt # 列出应用程序依赖的所有Python包 ├ tests/ # 测试代码包 │ ├ __init__.py │ └ test_*.py # 测试用例 └ myapp/ ├ admin/ # 蓝图目录 ├ static/ │ ├ css/ # css文件目录 │ ├ img/ # 图片文件目录 │ └ js/ # js文件目录 ├ templates/ # 模板文件目录 ├ __init__.py ├ forms.py # 存放所有表单,如果多,将其变为一个包 ├ models.py # 存放所有数据模型,如果多,将其变为一个包 └ views.py # 存放所有视图函数,如果多,将其变为一个包
|
应用与路由
1 2 3 4 5 6 7 8 9 10 11 12 13
| from flask import Flask app = Flask(__name__)
@app.rout('/hello') #route()函数是一个装饰器,它告诉应用程序哪个URL应该调用相关的函数。 def hello(): return 'Hello World'
if __name__ == '__main__': app.run()
|
app.route(rule, options)
- options 是要转发给基础Rule对象的参数列表。
- options 是要转发给基础Rule对象的参数列表。
- rule 参数表示与该函数的URL绑定。
在hello.py
中,URL/ hello
规则绑定到hello()函数。 因此,如果用户访问http://localhost:5000/hello
URL,hello()函数的输出将在浏览器中呈现。
也可用app.add_url_rule()
app.run(host, port, debug, options)
host |
要监听的主机名。 默认为127.0.0.1(localhost)。设置为“0.0.0.0”以使服务器在外部可用 |
port |
默认为5000 |
debug |
默认为false。 如果设置为true,则提供调试信息 |
options |
要转发到底层的Werkzeug服务器。 |
变量规则
通过向规则参数添加变量部分,可以动态构建URL。此变量部分标记为。它作为关键字参数传递给与规则相关联的函数。
在以下示例中,route()装饰器的规则参数包含附加到URL ‘/hello’的(默认为字符串)
1 2 3
| @app.route('/hello/<name>') def hello(name): return 'Hello %s!' % name
|
但url为http://127.0.0.1:5000/hello/xz
时
浏览器为Hello xz!
此外,还要以下转换器构建规则:
int |
整数 |
float |
浮点数 |
path |
接受用作目录分隔符的斜杠 |
例如
1 2 3
| @app.route('/number/<float:phone>') def revision(phone): return 'your phone number %f' % phone
|
url`http://127.0.0.1:5000/number/3.222`
response `your phone number 3.222000`
Flask URL构建
url_for()函数对于动态构建特定函数的URL非常有用。该函数接受函数的名称作为第一个参数,以及一个或多个关键字参数,每个参数对应于URL的变量部分。
以下脚本演示了如何使用url_for()函数:[注:来自 https://www.w3cschool.cn/flask/flask_url_building.html]
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| from flask import Flask, redirect, url_for app = Flask(name) @app.route('/admin') def hello_admin(): return 'Hello Admin'
@app.route('/guest/') def hello_guest(guest): return 'Hello %s as Guest' % guest
@app.route('/user/') def hello_user(name): if name =='admin': return redirect(url_for('hello_admin')) else: return redirect(url_for('hello_guest',guest = name))
if name == 'main': app.run(debug = True)
|
在Flask中,使用redirect()函数实现重定向功能,函数原型如下:
flask.redirect(location, code=302, Response=None)
location |
code |
Response |
是一个链接地址,可以使用url_for()函数得到,也可以是静态文件地址,测试了模板文件的地址,失败——看来模板还是挺安全的 |
可以取值为301、302、303、305、307,默认302,300、304不可以; |
|
- 当url为
http://localhost:5000/user/admin
,ResponseHello Admin
- 当url为
http://localhost:5000/user/guest
,ResponseHello guest as Guest
HTTP方法
flask 默认的方法是 GET,但也可通过route()装饰器提供方法参数来更改此选项
下面先构建一个Html表单,再用POST方式发给URL
1 2 3 4 5 6 7 8 9 10 11
| <html> <body> <form action = "http://localhost:5000/login" method = "post"> <p>Enter Name:</p> <p><input type = "text" name = "nm" /></p> <p><input type = "submit" value = "submit" /></p> </form> </body> </html>
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
| from flask import Flask, redirect, url_for, request app = Flask(__name__)
@app.route('/post/<name>') def post(name): return 'method: %s' % name
@app.route('/get/<name>') def get(name): return 'method: %s' % name
@app.route('/login',methods = ['POST', 'GET']) def login(): if request.method == 'POST': user = request.form['nm'] return redirect(url_for('post',name = user)) else: user = request.args.get('nm') return redirect(url_for('get',name = user))
if __name__ == '__main__': app.run(debug = True)
|
- post 方式时
服务器以post方式得到传参nm
- get 方式时
1 2 3
| <p>Enter Name:</p> <p><input type="text" name="nm"></p> <p><input type="submit" value="submit"></p>
|
服务器以get方式得到传参nm
模板
Flask的模板功能是基于Jinja2模板引擎实现的
Jinja2模板引擎使用以下分隔符从HTML转义。
…不知道为什么hexo 没法写这段
hello.py
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| from flask import Flask
from flask import render_template
app = Flask(__name__)
@app.route('/hello')
@app.route('/hello/<name>') def hello(name=None):
return render_template('hello.html', name=name)
if __name__ == '__main__':
app.run(debug=True)
|
hello.html
1 2 3 4 5 6 7 8 9 10 11 12 13
| <!doctype html>
<title>Hello Sample</title>
{% if name %}
<h1>Hello {{ name }}!</h1>
{% else %}
<h1>Hello World!</h1>
{% endif %}
|
http://localhost:5000/hello
但name无时,模板代码进入了Hello World!
分支.
http://localhost:5000/hello/ha
模板代码进入了Hello {{ name }}!
分支,而且变量{{ name }}
被替换为了ha
除了if 以外,也可用for
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
| from flask import Flask, render_template
app = Flask(__name__)
@app.route('/result') def result(): dict = {'phy':50,'che':60,'maths':70} return render_template('result.html', result = dict)
if __name__ == '__main__': app.run(debug = True) result.html ```html <!doctype html>
<title>This is a Result</title>
<table border = 1> {% for key,value in result.items() %} <tr> <th> {{ key }} </th> <td> {{value}} </td> </tr> {% endfor %} </table>
|
推荐学习:
pythonFlask框架学习
w3cschool_flask