sudo apt-get update
sudo pip3 install flask==1.0.2
设置 FLASK_ENV
环境变量为 development
:
$ export FLASK_ENV=development
$ export FLASK_DEBUG=1
$ flask run
路由
from flask import Flask
app = Flask(__name__)
# 如果访问 /,返回 Index Page
@app.route('/')
def index():
return 'Index Page'
# 如果访问 /hello,返回 Hello, World!
@app.route('/hello')
def hello():
return 'Hello, World!'
然后在终端执行如下命令启动服务:
export FLASK_APP=hello.py
export FLASK_ENV=development
flask run
'/'只可多不可少,构建一个 URL 来匹配一个特定的函数可以使用 url_for()
方法,
HTTP (也就是 Web 应用协议) 有不同的方法来访问 URLs 。默认情况下,路由只会响应 GET 请求,但是能够通过给 route()
装饰器提供 methods
参数来改变。这里是一个例子:
@app.route('/login', methods=['GET', 'POST'])
请开发一个小应用,URL 地址输入
http://127.0.0.1:5000/xxx
(其中 xxx 表示你的名字),访问页面会显示xxx
。from flask import Flask
app = Flask(__name__)
@app.route('/<username>')
def get_name(username):
return username
请完成一个应用,当 URL 是
http://127.0.0.1:5000/sum/a/b
时,其中a
和b
都是数字,服务器返回它们的和。from flask import Flask
app = Flask(__name__)
@app.route('/sum/<int:a>/<int:b>')
def get_sum(a,b):
return '{0} + {1} = {2}'.format(a,b,a+b)
静态文件与渲染模板
1. 在你的包中或模块旁边创建一个名为static
的文件夹,在应用中使用 /static
即可访问。
给静态文件生成 URL ,使用特殊的 static
端点名:
url_for('static', filename='style.css')
这个文件是应该存储在文件系统上的static/style.css
。
2. 使用方法 render_template()
来渲染模板。所有你需要做的就是提供模板的名称以及你想要作为关键字参数传入模板的变量。
from flask import Flask, render_template
app = Flask(__name__)
@app.route('/hello/')
@app.route('/hello/<name>')
def hello(name=None): # 默认 name 为 None
return render_template('hello.html', name=name) # 将 name 参数传递到模板变量中
Flask 将会在 templates
文件夹中寻找模板。因此如果你的应用是个模块,这个文件夹在模块的旁边,如果它是一个包,那么这个文件夹在你的包里面:
比如,应用是模块:
/application.py
/templates
/hello.html
比如,应用是包:
/application
/__init__.py
/templates
/hello.html
在 /home/shiyanlou/Code
目录下新建 templates
文件夹并在其中新建 hello.html
文件
上传文件及保存
import os
from flask import Flask, request
from werkzeug import secure_filename # 获取上传文件的文件名
UPLOAD_FOLDER = '/home/shiyanlou/Code' # 上传路径
ALLOWED_EXTENSIONS = set(['txt', 'pdf', 'png', 'jpg', 'jpeg', 'gif']) # 允许上传的文件类型
app = Flask(__name__)
app.config['UPLOAD_FOLDER'] = UPLOAD_FOLDER
def allowed_file(filename): # 验证上传的文件名是否符合要求,文件名必须带点并且符合允许上传的文件类型要求,两者都满足则返回 true
return '.' in filename and \
filename.rsplit('.', 1)[1] in ALLOWED_EXTENSIONS
@app.route('/', methods=['GET', 'POST'])
def upload_file():
if request.method == 'POST': # 如果是 POST 请求方式
file = request.files['file'] # 获取上传的文件
if file and allowed_file(file.filename): # 如果文件存在并且符合要求则为 true
filename = secure_filename(file.filename) # 获取上传文件的文件名
file.save(os.path.join(app.config['UPLOAD_FOLDER'], filename)) # 保存文件
return '{} upload successed!'.format(filename) # 返回保存成功的信息
# 使用 GET 方式请求页面时或是上传文件失败时返回上传文件的表单页面
return '''
<!doctype html>
<title>Upload new File</title>
<h1>Upload new File</h1>
<form action="" method=post enctype=multipart/form-data>
<p><input type=file name=file>
<input type=submit value=Upload>
</form>
'''
用户登录功能
app.py:
from flask import Flask, request
from flask import flash, redirect, url_for, render_template, session
app = Flask(__name__)
app.secret_key = b'_5#y2L"F4Q8z\n\xec]/'
@app.route('/<name>')
def index(name):
return render_template('index.html',name=name)
@app.route('/login', methods=['GET', 'POST'])
def login():
if request.method == 'POST':
if request.form['username'] != 'shiyanlou' or request.form['password'] != 'shiyanlou':
flash('username or password invalid')
return redirect(url_for('index', name='world'))
else:
session['username'] = request.form['username']
name = request.form['username']
flash('you were logged in')
return redirect(url_for('index', name=name))
return render_template('login.html')
templates/index.html:
<!doctype html>
<title>Index</title>
<div>
{% for message in get_flashed_messages() %}
<div class=flash>{{ message }}</div>
{% endfor %}
<h1>hello {{name}}</h1>
</div>
templates/login.html:
<!doctype html>
<title>Login</title>
<div>
<form action="{{ url_for('login') }}" method=post>
<dl>
<dt>Username:
<dd><input type=text name=username>
<dt>Password:
<dd><input type=password name=password>
<dd><input type=submit value=Login>
</dl>
</form>
</div>