У меня проблемы с использованием декораторов функций Python в Google AppEngine. Я не очень знаком с декораторами, но они кажутся полезными в веб-программировании, когда вы можете заставить пользователя войти в систему перед выполнением определенных функций.
В любом случае, я следовал вместе с примером входа в flickr здесь , который использует django и украшает функцию, требующую входа в систему flickr. Я не могу заставить этот тип декоратора работать в AppEngine.
Я свел это к следующему:
def require_auth(func):
def check_auth(*args, **kwargs):
print "Authenticated."
return func(*args, **kwargs)
return check_auth
@require_auth
def content():
print "Release sensitive data!"
content()
Этот код работает из командной строки, но когда я запускаю его в GoogleAppEngineLauncher (OS X), я получаю следующую ошибку:
check_auth() takes at least 1 argument (0 given)
И я не совсем уверен, почему ...
РЕДАКТИРОВАТЬ, чтобы включить фактический код:
@ asperous.us Я изменил определение content (), добавив переменные аргументы. Это то, что вы имели в виду?
@ Алекс Мартелли, «print» работает в AppEngine, но все еще является справедливой критикой.
Как я уже сказал, я пытаюсь использовать логин flickr по ссылке выше. Я пытался вставить его в свое приложение так:
def require_flickr_auth(view):
def protected_view(request,*args, **kwargs):
if 'token' in request.session:
token = request.session['token']
log.info('Getting token from session: %s' % token)
else:
token = None
log.info('No token in session')
f = flickrapi.FlickrAPI(api_key, api_secret,
token=token, store_token=False)
if token:
# We have a token, but it might not be valid
log.info('Verifying token')
try:
f.auth_checkToken()
except flickrapi.FlickrError:
token = None
del request.session['token']
if not token:
# No valid token, so redirect to Flickr
log.info('Redirecting user to Flickr to get frob')
url = f.web_login_url(perms='read')
print "Redirect to %s" % url
# If the token is valid, we can call the decorated view.
log.info('Token is valid')
return view(request,*args, **kwargs)
return protected_view
@require_flickr_auth
def content(*args, **kwargs):
print 'Welcome, oh authenticated user!'
def main():
print 'Content-Type: text/plain'
content()
if __name__ == "__main__":
main()
Когда я удаляю украшение @require_flickr_auth, строка «Welcome ...» печатается очень хорошо. В противном случае я получаю большую уродливую страницу исключений AppEngine с
type 'exceptions.TypeError': protected_view() takes at least 1 argument (0 given)
внизу.