follow my dream

flask

字数统计: 1.6k阅读时长: 7 min
2020/01/30 Share

本文为flask学习记录

环境安装

安装virtualenv

virtualenv是一个虚拟的Python环境构建器。它可以帮助用户并行创建多个Python环境。 因此,它可以避免不同版本的库之间的兼容性问题。
pip install virtualenv
安装后,将在文件夹中创建新的虚拟环境。

1
2
3
4
cd D:
mkdir myproject
cd myproject
virtualenv venv

要在 Windows 上激活相应的环境,可以使用以下命令:
venv\scripts\activate
安装好后
finish
可在这个环境中安装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__)
#Flask构造函数使用当前模块(__name __)的名称作为参数。

@app.rout('/hello') #route()函数是一个装饰器,它告诉应用程序哪个URL应该调用相关的函数。
def hello():
return 'Hello World'
#app.add_url_rule('/hello','hello',hello)


if __name__ == '__main__':
app.run()

app.route(rule, options)

  • options 是要转发给基础Rule对象的参数列表。
  • options 是要转发给基础Rule对象的参数列表。
  • rule 参数表示与该函数的URL绑定。

hello.py中,URL/ hello 规则绑定到hello()函数。 因此,如果用户访问http://localhost:5000/helloURL,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
    服务器以post方式得到传参nm
    post
  • get 方式时
    1
    2
    3
    <p>Enter Name:</p>
    <p><input type="text" name="nm"></p>
    <p><input type="submit" value="submit"></p>
    post
    服务器以get方式得到传参nm
    post

模板

Flask的模板功能是基于Jinja2模板引擎实现的

  • Application folder
    • Hello.py
    • templates
      • hello.html

Jinja2模板引擎使用以下分隔符从HTML转义。

Jinja2
…不知道为什么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! 分支.
    temp
  • http://localhost:5000/hello/ha 模板代码进入了Hello {{ name }}! 分支,而且变量{{ name }}被替换为了ha
    temp

除了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>

result_for

推荐学习:
pythonFlask框架学习
w3cschool_flask

CATALOG
  1. 1. 环境安装
    1. 1.1. 安装virtualenv
  2. 2. 大致框架
  3. 3. 应用与路由
  4. 4. 变量规则
  5. 5. Flask URL构建
  6. 6. HTTP方法
  7. 7. 模板