zoukankan      html  css  js  c++  java
  • 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
  • 相关阅读:
    第十一章 练习。内附100道练习题URL
    第八章 模块;第九章 文件
    mysql union和join 的使用
    第七章 循环
    第六章 课后习题
    第六章 字符串操作
    第五章 课后习题
    第五章 容器之字典
    实战智能推荐系统笔记
    协同过滤推荐算法的原理及实现
  • 原文地址:https://www.cnblogs.com/tangpg/p/9298831.html
Copyright © 2011-2022 走看看