装饰器:flask/flask_login,使用 login_required
Decorators: flask/flask_login, using login_required
我想在有和没有 flask login_required
装饰器的情况下使用我的渲染函数。我的尝试如下:定义基本函数,然后分配给一个新变量,用 login_required
:
包裹
import pymongo
from flask import render_template
from flask_login import login_required
def base_page(collection='posts'):
db = pymongo.MongoClient().www
title = collection.capitalize()
page = db[collection].find().sort("created", pymongo.DESCENDING)
return render_template('home/home.html', **locals())
base_page_login_required = login_required(base_page)
然后我在 app.add_url_rule
调用中使用这些:
app.add_url_rule('/blog', view_func=base_page, defaults={'collection': 'posts'})
app.add_url_rule('/users', view_func=base_page_login_required, defaults={'collection': 'users'})
但显然我有问题:
Traceback (most recent call last):\r, referer: http://localhost/
File "C:/www/flask/wsgi.py", line 26, in <module>\r, referer: http://localhost/
app.add_url_rule('/users', view_func=base_page_login_required, defaults={'collection': 'users'})\r, referer: http://localhost/
File "C:\bin\Python34\lib\site-packages\flask\app.py", line 62, in wrapper_func\r, referer: http://localhost/
return f(self, *args, **kwargs)\r, referer: http://localhost/
File "C:\bin\Python34\lib\site-packages\flask\app.py", line 984, in add_url_rule\r, referer: http://localhost/
'existing endpoint function: %s' % endpoint)\r, referer: http://localhost/
AssertionError: View function mapping is overwriting an existing endpoint function: base_page\r, referer: http://localhost/
谁能帮我理解这个错误?我假设这是特定于烧瓶和 add_url_rule
。我知道我可以将第一个功能代码复制到第二个并正常使用装饰器,但我想遵循 DRY。
Flask 使用 endpoint 名称注册路由;您在 url_for()
中使用此名称生成 URL。
默认情况下,Flask为此使用函数名,function.__name__
的值。将函数分配给另一个名称(即使使用正确构造的装饰器进行装饰),也不会为函数对象赋予新名称。
您可以使用 endpoint
关键字参数为您的第二次注册取一个不同的名称:
app.add_url_rule('/blog', view_func=base_page,
defaults={'collection': 'posts'})
app.add_url_rule('/users', view_func=base_page_login_required,
endpoint='users',
defaults={'collection': 'users'})
我想在有和没有 flask login_required
装饰器的情况下使用我的渲染函数。我的尝试如下:定义基本函数,然后分配给一个新变量,用 login_required
:
import pymongo
from flask import render_template
from flask_login import login_required
def base_page(collection='posts'):
db = pymongo.MongoClient().www
title = collection.capitalize()
page = db[collection].find().sort("created", pymongo.DESCENDING)
return render_template('home/home.html', **locals())
base_page_login_required = login_required(base_page)
然后我在 app.add_url_rule
调用中使用这些:
app.add_url_rule('/blog', view_func=base_page, defaults={'collection': 'posts'})
app.add_url_rule('/users', view_func=base_page_login_required, defaults={'collection': 'users'})
但显然我有问题:
Traceback (most recent call last):\r, referer: http://localhost/
File "C:/www/flask/wsgi.py", line 26, in <module>\r, referer: http://localhost/
app.add_url_rule('/users', view_func=base_page_login_required, defaults={'collection': 'users'})\r, referer: http://localhost/
File "C:\bin\Python34\lib\site-packages\flask\app.py", line 62, in wrapper_func\r, referer: http://localhost/
return f(self, *args, **kwargs)\r, referer: http://localhost/
File "C:\bin\Python34\lib\site-packages\flask\app.py", line 984, in add_url_rule\r, referer: http://localhost/
'existing endpoint function: %s' % endpoint)\r, referer: http://localhost/
AssertionError: View function mapping is overwriting an existing endpoint function: base_page\r, referer: http://localhost/
谁能帮我理解这个错误?我假设这是特定于烧瓶和 add_url_rule
。我知道我可以将第一个功能代码复制到第二个并正常使用装饰器,但我想遵循 DRY。
Flask 使用 endpoint 名称注册路由;您在 url_for()
中使用此名称生成 URL。
默认情况下,Flask为此使用函数名,function.__name__
的值。将函数分配给另一个名称(即使使用正确构造的装饰器进行装饰),也不会为函数对象赋予新名称。
您可以使用 endpoint
关键字参数为您的第二次注册取一个不同的名称:
app.add_url_rule('/blog', view_func=base_page,
defaults={'collection': 'posts'})
app.add_url_rule('/users', view_func=base_page_login_required,
endpoint='users',
defaults={'collection': 'users'})