Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/reactjs/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Django 将视图参数传递给装饰器并重定向到登录视图_Django_View_Decorator - Fatal编程技术网

Django 将视图参数传递给装饰器并重定向到登录视图

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

这是我的管理视图,我需要一个装饰器来代替“事件会话检查”,但我不知道如何将“事件密钥”传递给装饰器,所以我写了“事件会话检查”

“event\u session\u required”将验证EventSet model not auth中的ID和密码。用户,请帮助我

"""
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
中,您需要关键字

您有两个选择:

  • 更改URL定义以使用关键字参数
  • 确保每个将装饰为所需的
    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):
        ...