有没有人知道在单元测试期间设置(模拟)FLask(Werkzeug)提供的请求对象的User-Agent的方法?
就目前而言,当我尝试获取诸如request.headers ['User-Agent']之类的细节时,会引发KeyError,因为Flask test_client()没有设置它们.(参见下面的部分堆栈跟踪)
在单元测试期间尝试从Flask项目中的请求对象获取User-Agent时,会引发KeyError.
File "/Users/me/app/rest/app.py", line 515, in login
if request.headers['User-Agent']:
File "/Users/me/.virtualenvs/app/lib/python2.7/site-packages/werkzeug/datastructures.py", line 1229, in __getitem__
return self.environ['HTTP_' + key]
KeyError: 'HTTP_USER_AGENT'
Run Code Online (Sandbox Code Playgroud)
- 更新 -
除了以下(接受)解决方案之外,environ_base提示引导我使用其他SO解决方案.此解决方案的前提是为Flask应用程序创建一个包装类,并覆盖调用方法以自动设置环境变量.这样,就为所有调用设置了变量.所以,我最终实现的解决方案是创建这个代理类:
class FlaskTestClientProxy(object):
def __init__(self, app):
self.app = app
def __call__(self, environ, start_response):
environ['REMOTE_ADDR'] = environ.get('REMOTE_ADDR', '127.0.0.1')
environ['HTTP_USER_AGENT'] = environ.get('HTTP_USER_AGENT', 'Chrome')
return self.app(environ, start_response)
Run Code Online (Sandbox Code Playgroud)
然后用该代理包装WSGI容器:
app.wsgi_app = FlaskTestClientProxy(app.wsgi_app)
test_client = app.test_client()
Run Code Online (Sandbox Code Playgroud) 以下 3 个链接并没有用外行的术语解释我真正想要实现的目标
我有以下代码
@app.route('/rate_isp_service', methods=['GET', 'POST'])
@login_required
def rate_isp_service():
isp_query = db.session.query(Isps)
isp_entries = [dict
(isp_id=isp.isp_id, isp_name=isp.isp_name, isp_description=isp.isp_description) for isp in
isp_query]
services_query = db.session.query(Services)
services_entries = [dict
(service_id=service.service_id, service_name=service.service_name,
service_catergory_id=service.service_catergory_id) for service in
services_query]
ratings_query = db.session.query(Ratings)
ratings_entries = [dict
(ratings_id=rating.ratings_id, rating_value=rating.rating_value,
rating_comment=rating.rating_comment) for rating in
ratings_query]
servicemetric_query = db.session.query(Service_metric)
servicemetric_entries = [dict
(metric_id=metric.metric_id, metric_name=metric.metric_name,
metric_description=metric.metric_description) for metric in
servicemetric_query]
return render_template('rate_isp_service.html', isp_entries=isp_entries, services_entries=services_entries,ratings_entries=ratings_entries)
Run Code Online (Sandbox Code Playgroud)
这段代码会在我的 html 模板中填充我所有的下拉列表,只要有表单。
我不得不在所有视图中多次包含此代码,因为我找不到将它包含在某些视图中的方法 …