在做Miguel Grinberg的Flask Web开发时,我在测试gravatar代码时遇到了困难,
def test_gravatar(self):
u = User(email='john@example.com', password='cat')
with self.app.test_request_context('/'):
gravatar = u.gravatar()
gravatar_256 = u.gravatar(size=256)
gravatar_pg = u.gravatar(rating='pg')
gravatar_retro = u.gravatar(default='retro')
with self.app.test_request_context('/', base_url='https://example.com'):
gravatar_ssl = u.gravatar()
self.assertTrue('http://www.gravatar.com/avatar/' +
'd4c74594d841139328695756648b6bd6'in gravatar)
self.assertTrue('s=256' in gravatar_256)
self.assertTrue('r=pg' in gravatar_pg)
self.assertTrue('d=retro' in gravatar_retro)
self.assertTrue('https://secure.gravatar.com/avatar/' +
'd4c74594d841139328695756648b6bd6' in gravatar_ssl)
app.test_request_context()做什么以及它与app_context()有什么不同?
为什么我们甚至需要使用self.app.test_request_context('/')调用?另外,我们可以做些什么更改来将调用转移到SetUp()中的app.test_request_context()?
答案 0 :(得分:4)
有关该主题的大量阅读材料,请从文档开始:app_context
,test_request_context
,您可以随时仔细检查代码:app_context
和{{3 }}。另外,test_request_context
文章讨论了Flask的背景。
这是很多链接,所以要分解:
我们可以看到app_context
创建了一个新的应用上下文,而test_request_context
创建了一个新的请求上下文。应用程序上下文在here's中创建:使用app_context
手动创建,并在创建请求上下文时创建请求上下文,然后使用test_request_context
或two situations创建。
因此,当创建at the beginning of the request, RequestContext 时。创建此对象会创建应用程序上下文。
为什么test_request_context
?在请求创建的上下文之外工作时,您需要上下文来访问应用程序,例如您可能识别的request comes into your application,例如proxies,current_app
, request
和g
。进入代码时,当您使用test_request_context
而不是session
创建RequestContext时,您将获得request_context
。
答案 1 :(得分:0)
在此处查看tbicr的答案。
具体来说,这段代码
gravatar = u.gravatar()
gravatar_256 = u.gravatar(size=256)
gravatar_pg = u.gravatar(rating='pg')
gravatar_retro = u.gravatar(default='retro')
需要请求上下文,因为它需要访问' request'变量
用户模型中的重力方法定义需要'请求'变量
def gravatar(self, size=100, default='identicon', rating='g'):
if request.is_secure: # here
url = 'https://secure.gravatar.com/avatar'
else:
url = 'http://www.gravatar.com/avatar'
hash = self.avatar_hash or hashlib.md5(self.email.encode('utf-8')).hexdigest()
return '{url}/{hash}?s={size}&d={default}&r={rating}'.format(url=url, hash=hash, size=size, default=default, rating=rating)