Ich habe Probleme mit Python Funktion Dekoratoren in Google AppEngine. Ich bin nicht so vertraut mit Dekoratoren, aber sie scheinen nützlich in Web-Programmierung, wenn Sie einen Benutzer zur Anmeldung zwingen möchten, bevor bestimmte Funktionen ausgeführt werden.Python Funktion Dekoratoren in Google App Engine
Wie auch immer, ich folgte mit einem Flickr-Login-Beispiel here, die Django verwendet und eine Funktion dekoriert, um die Flickr-Anmeldung zu erfordern. Ich kann nicht scheinen, dass diese Art von Dekorateur in AppEngine funktioniert.
Ich habe es gekocht unten zu diesem:
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()
Dieser Code von der Kommandozeile funktioniert, aber wenn ich es in GoogleAppEngineLauncher (OS X) laufen lasse, erhalte ich folgende Fehlermeldung:
check_auth() takes at least 1 argument (0 given)
Und ich bin nicht wirklich sicher, warum ...
EDIT eigentlichen Code enthalten: @ asperous.us änderte ich die Definition von Inhalten() Variable Argumente enthalten, ist was hast du gemeint? @Alex Martelli, 'print' funktioniert in AppEngine, aber immer noch eine völlig faire Kritik. Wie gesagt, ich versuche den Flickr Login über den obigen Link zu benutzen. Ich habe versucht, es in meine App zu setzen wie so:
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()
Wenn ich die @require_flickr_auth Dekoration zu entfernen, die Zeichenfolge ‚Welcome ...‘ just fine ausdruckt. Ansonsten bekomme ich eine große hässliche AppEngine-Ausnahmeseite mit
type 'exceptions.TypeError': protected_view() takes at least 1 argument (0 given)
an der Unterseite.
Doh - Das ist es total. Vielen Dank! – Owen