• django-类装饰器method_decorator


    import os
    from django.shortcuts import render
    from django.contrib.admin.views.decorators import staff_member_required
    from django.views.generic import View
    from django.views.decorators.http import require_POST, require_GET
    from django.contrib.auth.decorators import login_required  # 登录装饰器
    from django.utils.decorators import method_decorator
    
    
    from ..news.models import NewsCategory, News
    from ..news.forms import NewsForm
    
    from utils import restful
    
    
    # Create your views here.
    # staff_member_required(login_url) 用来验证is_staff(User表中的字段)是否为真,判断用户能否登入cms页面,
    # login_url是不通过验证跳转, 前端通过login函数登录后的user.is_staff判断是否显示
    @staff_member_required(login_url='/')
    def index(request):
        return render(request, 'cms/index.html')
    
    
    # method_decorator 使装饰器装饰在类上面(装饰器的类装饰器?)  login_required 登陆验证,失败跳转
    # despatch 类里面有多个方法(get,post).将这些方法都装饰在despatch中,(通过despatch方法确定出get or post 再由login_required装饰)。
    @method_decorator(login_required(login_url='/account/login/'), name='dispatch')
    class WriteNewsView(View):
        def get(self, request):
            categories = NewsCategory.objects.all()
            return render(request, 'cms/write_news1.html', locals())
    
        def post(self, request):
            forms = NewsForm(request.POST)
            if forms.is_valid():
                cleaned_data = forms.cleaned_data
                title = cleaned_data.get('title')
                desc = cleaned_data.get('desc')
                thumbnail = cleaned_data.get('thumbnail')
                content = cleaned_data.get('content')
                author = request.user
    
                category_id = cleaned_data.get('category')
                category = NewsCategory.objects.get(id=category_id)
                try:
                    News.objects.create(
                        title=title, desc=desc, thumbnail=thumbnail, content=content, category=category, author=author
                    )
                    return restful.ok()
                except:
                    return restful.params_error("服务器gg")
            error = forms.get_first_message()
            return restful.params_error(error)
    
       # 简化版dispatch. 是View中的方法
    def dispatch(self, request, *args, **kwargs): if request.method == "GET": return self.get(request) elif request.method == "POST": return self.post(request)

     自定义django登录装饰器

    def xfz_auth_required(func):
        def wrapper(request, *args, **kwargs):
            if request.user.is_authenticated:
                return func(request, *args, **kwargs)
            else:
                if request.is_ajax():
                    return restful.params_error(message="请登陆")
                return redirect('/account/login')
        return wrapper
  • 相关阅读:
    Java Web前后端分离的思考与实践
    JDBC剖析篇(1):java中的Class.forName()
    UVa1471
    Uva11572
    Uva11134
    Uva10755
    Floyd判圈法
    Java泛型-通配符的上限和下限问题
    Codeforces 384E-线段树+dfs序
    codeforcesRound378C-dfs+树状数组
  • 原文地址:https://www.cnblogs.com/tangpg/p/9298831.html
Copyright © 2020-2023  润新知