Django 将视图参数传递给装饰器并重定向到登录视图
这是我的管理视图,我需要一个装饰器来代替“事件会话检查”,但我不知道如何将“事件密钥”传递给装饰器,所以我写了“事件会话检查” “event\u session\u required”将验证EventSet model not auth中的ID和密码。用户,请帮助我Django 将视图参数传递给装饰器并重定向到登录视图,django,view,decorator,Django,View,Decorator,这是我的管理视图,我需要一个装饰器来代替“事件会话检查”,但我不知道如何将“事件密钥”传递给装饰器,所以我写了“事件会话检查” “event\u session\u required”将验证EventSet model not auth中的ID和密码。用户,请帮助我 """ def event_session_required(): def _session_required(view_func): @wraps(view_func) def __sess
"""
def event_session_required():
def _session_required(view_func):
@wraps(view_func)
def __session_required(request, *args, **kwargs):
next = request.get_full_path()
event_key = kwargs.pop('event_key', '')
session_key = 'event_%s' % event_key
print session_key
login_path = reverse('event-manage-login', args=[event_key])
redirect_url = login_path + '?next=' + next
try:
session = request.session.get(session_key)
if session is None:
raise ValueError('Cannot use None at session value')
except KeyError as e:
messages.error(request, 'session key not found')
return redirect(redirect_url)
except ValueError as e:
messages.error(request, e.message)
return redirect(redirect_url)
else:
if session:
return view_func(request, *args, **kwargs)
else:
return redirect(redirect_url)
return __session_required
return _session_required
"""
def event_session_check(request, event_key):
session_key = 'event_%s' % event_key
if session_key not in request.session or request.session[session_key] != True:
next = request.get_full_path()
next = urlquote_plus(next)
next = iri_to_uri(next)
login_path = reverse('event-manage-login', args=[event_key])
redirect_url = login_path + '?next=' + next
return redirect_url
return None
#@event_session_required
def event_manage(request, event_key):
check_session = event_session_check(request, event_key)
if check_session:
return redirect(check_session)
try:
eventset = EventSet.objects.get(key=event_key)
except EventSet.DoesNotExist:
raise Http404
template = 'event/manage.html'
return render(request, template, {'eventset' : eventset })
#@event_session_required
def event_manage_detail(request, event_key, detail_key:
check_session = event_session_check(request, event_key)
if check_session:
return redirect(check_session)
try:
eventset = EventSet.objects.get(key=event_key)
except EventSet.DoesNotExist:
raise Http404
event_details = eventset.details.all()
template = 'event/manage_detail.html'
return render(request, template, {
'eventset' : eventset,
'event_details': event_details
})
固定的
对!!谢谢@V Stoykov和@Aldian Fazrihady,我终于修好了我的代码。现在效果很好
URL.py:
from django.conf.urls import patterns, url
urlpatterns = patterns('event.views.manage',
url(r'^(?P<event_key>\w+)/login$', 'event_login', name='event-manage-login'),
url(r'^(?P<event_key>\w+)/logout$', 'event_logout', name='event-manage-logout'),
url(r'^(?P<event_key>\w+)/manage$', 'event_manage', name='eventset.manageid '),
url(r'^(?P<event_key>\w+)/edit$', 'event_manage_detail', name='event-manage-detail')
)
manage.py
def event_login(request, event_key):
...
try:
eventset = EventSet.objects.get(key=event_key)
except EventSet.DoesNotExist:
raise Http404
next request.GET.get('next', '')
if request.method == 'POST':
if eventset.manageid == request.POST.get('manageid', '') and eventset.managepwd == request.POST.get('managepwd', '') and eventset.manageid and eventset.managepwd:
......
return redirect(next)
else:
......
...
@event_session_required
def event_manage(request, event_key):
try:
eventset = EventSet.objects.get(key=event_key)
except EventSet.DoesNotExist:
raise Http404
template = 'event/manage.html'
return render(request, template, {'eventset' : eventset })
@event_session_required
def event_manage_detail(request, event_key, detail_key:
try:
eventset = EventSet.objects.get(key=event_key)
except EventSet.DoesNotExist:
raise Http404
event_details = eventset.details.all()
template = 'event/manage_detail.html'
return render(request, template, {
'eventset' : eventset,
'event_details': event_details
})
def event_logout(request, event_key):
session_key = 'event_%s' % event_key
try:
del request.session[session_key]
except:
pass
return redirect(reverse('event-manage', args=[event_key]))
我看到一个问题和一个可能的问题 问题是您的decorator
event\u session\u required
不接受任何参数。相反,真正的装饰器是它内部所需的函数
使用当前代码(如果未注释),如果要修饰函数,则需要调用修饰器。例如:
@event_session_required()
def event_manage(request, event_key):
....
如果不需要将任何参数传递给所需的事件会话
,则可以使其直接接收查看函数
,并删除所需的会话
函数
def event_session_required(view_func):
@wraps(view_func)
def __session_required(request, *args, **kwargs):
...
@event_session_required
def event_manage(request, event_key):
...
而且在包装视图中也有一个可能的问题\u session\u required
。我不知道您如何在url.py
中描述URL,但从我看到的情况来看,我认为它是一个位置参数,而不是关键字。在\u会话\u required
中,您需要关键字
您有两个选择:
event\u session\u
的函数将event\u键
接收为第一个位置参数(在请求
之后),并将所需的会话
更改为期望它作为第一个参数而不是关键字我会建议第一个我从不创建最外层的功能,就像您需要的事件会话一样。 我总是直接进入function_session_required(视图),因此装饰程序将是@u session_required(需要的) 不要在kwargs中搜索事件\ U键,而是尝试在args中查找它
def event_session_required(view_func):
@wraps(view_func)
def __session_required(request, *args, **kwargs):
...
@event_session_required
def event_manage(request, event_key):
...