访问请求数据对于 Web 应用,与客户端发送给服务器的数据交互至关重要。在 Flask 中 由全局的 环境局部变量内幕 如果你想理解其工作机制及如何利用环境局部变量实现自动化测试,请阅 读此节,否则可跳过。 Flask 中的某些对象是全局对象,但却不是通常的那种。这些对象实际上是特定 环境的局部对象的代理。虽然很拗口,但实际上很容易理解。 想象一下处理线程的环境。一个请求传入,Web 服务器决定生成一个新线程( 或者别的什么东西,只要这个底层的对象可以胜任并发系统,而不仅仅是线程)。 当 Flask 开始它内部的请求处理时,它认定当前线程是活动的环境,并绑定当 前的应用和 WSGI 环境到那个环境上(线程)。它的实现很巧妙,能保证一个应 用调用另一个应用时不会出现问题。 所以,这对你来说意味着什么?除非你要做类似单元测试的东西,否则你基本上 可以完全无视它。你会发现依赖于一段请求对象的代码,因没有请求对象无法正 常运行。解决方案是,自行创建一个请求对象并且把它绑定到环境中。单元测试 的最简单的解决方案是:用 from flask import request
with app.test_request_context('/hello', method='POST'):
# now you can do something with the request until the
# end of the with block, such as basic assertions:
assert request.path == '/hello'
assert request.method == 'POST'
另一种可能是:传递整个 WSGI 环境给 from flask import request
with app.request_context(environ):
assert request.method == 'POST'
请求对象API 章节对请求对象作了详尽阐述(参见 from flask import request
当前请求的 HTTP 方法可通过 @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)
当访问 form 属性中的不存在的键会发生什么?会抛出一个特殊的 你可以通过 searchword = request.args.get('q', '')
我们推荐用 get 来访问 URL 参数或捕获 KeyError ,因为用户可能会修 改 URL,向他们展现一个 400 bad request 页面会影响用户体验。 欲获取请求对象的完整方法和属性清单,请参阅 文件上传用 Flask 处理文件上传很简单。只要确保你没忘记在 HTML 表单中设置 已上传的文件存储在内存或是文件系统中一个临时的位置。你可以通过请求对象 的 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 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))
...
一些更好的例子,见 上传文件 模式。 |
Archiver|手机版|笨鸟自学网 ( 粤ICP备20019910号 )
GMT+8, 2025-1-3 05:44 , Processed in 0.016835 second(s), 17 queries .