【发布时间】:2015-04-15 23:19:15
【问题描述】:
根据文档,应允许 Cron 作业访问受管理员保护的视图。但是,如果我在 GET 方法上有 @admin_required 装饰器,则会收到 302 错误。
在 app.yaml 我已经定义了这个:
- url: /generator
script: run.news.app
login: admin
观点:
class GeneratorView(MethodView):
@admin_required
def get(self):
return 'success', 200
urls.py
app.add_url_rule('/generator', 'generator', view_func=GeneratorView.as_view('generator'))
cron 作业:
cron:
- description: Scrape every 3 hours
url: /generator
schedule: every 3 hours synchronized
装饰者:
def admin_required(func):
"""Requires App Engine admin credentials"""
@wraps(func)
def decorated_view(*args, **kwargs):
if users.get_current_user():
if not users.is_current_user_admin():
abort(401) # Unauthorized
return func(*args, **kwargs)
return redirect(users.create_login_url(request.url))
return decorated_view
有趣的是,当我删除 admin_required 装饰器时,由于 app.yaml 中的 login: admin,该 URL 仍然受到管理员保护。
但是,由于缺少装饰器,我的单元测试未通过授权检查。
def test_generator_fails_as_normal_user(self):
self.setCurrentUser(u'john@example.com', u'123')
rv = self.client.get('/generator')
self.assertEqual(rv.status_code, 401)
断言错误:200 != 401
如果我把装饰器放回去,单元测试会通过,而 cron 作业会失败。有什么建议吗?
【问题讨论】:
标签: python unit-testing google-app-engine flask cron