欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Flask 路由相关操作

程序员文章站 2022-06-21 13:24:14
URL Route URL 后接 作为目录级访问 URL 后不接 作为文件级访问 | 说明 | string | (default) accepts any text without a slash int | accepts positive integers float | accepts po ......

URL Route

  • URL 后接 / 作为目录级访问
  • URL 后不接 / 作为文件级访问
from flask import Flask
app = Flask(__name__)

@app.route('/')
def index():
    return 'Index Page'

@app.route('/about')
def about():
    return 'The about page'
说明
string (default) accepts any text without a slash
int accepts positive integers
float accepts positive floating point values
path like string but also accepts slashes
uuid accepts UUID strings
from flask import Flask
app = Flask(__name__)

@app.route('/user/<username>')
def show_user_profile(username):
    # show the user profile for that user
    return 'User %s' % 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' % subpath
  • 可以使用methods来指定该路由使用的HTTP方法。
from flask import request

@app.route('/login', methods=['GET', 'POST'])
def login():
    if request.method == 'POST':
        return do_the_login()
    else:
        return show_the_login_form()

参考

URL Binding

使用url_for()方法可以调用参数中的route方法,以便满足某种调用目的,如单元测试。

from flask import Flask
from flask import Flask, url_for
app = Flask(__name__)

with app.test_request_context():
    print(url_for('index'))
    print(url_for('login'))
    print(url_for('login', next='/'))
    print(url_for('profile', username='John Doe'))

静态文件伺候

静态文件指应用使用的JavascriptCSS代码及图片资源文件。

  • 在项目根目录下创建static目录
url_for('static', filename='style.css')

模板文件伺候

Flask会自动寻找templates目录,所以原则上请不要自定义这个目录的名字,且应该将其放在项目(或模块)的根路径下。

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)
<body>
    Hello, World!

    from templates
</body>

参考

请求处理

Request

@app.route('/test', methods=['POST', 'GET'])
def test():
    error = None
    
    if request.method == 'POST':
        t1 = request.form['1']
        t2 = request.form['2']
    elif request.method == 'GET':
        # for URL `?key=value`
        t3 = request.args.get('key', '')
    else:
        error = 'Method is not POST or GET!'

    return render_template('test.html', error=error)

参考

文件上传

  • 保存时重新指定文件名
from flask import request

@app.route('/upload', methods=['GET', 'POST'])
def upload_file():
    if request.method == 'POST':
        f = request.files['the_file']
        f.save('/var/www/uploads/uploaded_file.txt')
    ...
  • 保存时,使用上传的文件名
from flask import request
from werkzeug.utils import secure_filename

@app.route('/upload', methods=['GET', 'POST'])
def upload_file():
    if request.method == 'POST':
        f = request.files['the_file']
        f.save('/var/www/uploads/' + secure_filename(f.filename))
    ...

参考

Cookies

  • 读取cookie
from flask import request

@app.route('/')
def index():
    username = request.cookies.get('username')
    # use cookies.get(key) instead of cookies[key] to not get a
    # KeyError if the cookie is missing.
  • 写入cookie
from flask import make_response

@app.route('/')
def index():
    resp = make_response(render_template(...))
    resp.set_cookie('username', 'the username')
    return resp

重定向

  • 使用url_for来找到URL地址
  • 使用redirect来重定向
from flask import abort, redirect, url_for

@app.route('/')
def index():
    return redirect(url_for('login'))
  • 使用abort来返回错误码
@app.route('/login')
def login():
    abort(401)
    this_is_never_executed()
  • 使用@app.errorhandler()来处理错误码对应的请求
from flask import render_template

@app.errorhandler(404)
def page_not_found(error):
    return render_template('page_not_found.html'), 404

参考