YOLO813

Django初学(6)- 视图中的类装饰器和状态码

类视图装饰器

    之前,在Django初学(3)- 视图里面介绍过如何通过 django.views.decorators.http.require_http_methods来装饰视图函数,其中说明了“无论是get或者post,Django都会默认先走View下的dispatch方法”,所以我们只要将装饰器添加到覆写的dispatch方法上,即可实现装饰类视图效果。    例如,个人中心页面必须登录才可访问,如果没有登录,那么就将其重定向至登录页

# django推荐将装饰器都用method_decorator包裹
from django.utils.decorators import method_decorator
# 自己写的装饰器
def login_required(func):
    def wrapper(req, *args, **kwargs):
        if not req.GET.get('username'):
            return redirect(reverse('art:login'))
        else:
            return func(req, *args, **kwargs)
    return wrapper

class Profile(View):
    def get(self,request):
        return HttpResponse("个人中心")
    @method_decorator(login_required)
    def dispatch(self, request, *args, **kwargs):
        return super().dispatch(request, *args, **kwargs)

def login(req):
    return HttpResponse("login")


    我们还有第二种方法可以解决,直接将method_decorator挂在类上面,如下:

@method_decorator([login_required], name='dispatch')
class Profile(View):
    def get(self,request):
        return HttpResponse("个人中心")

method_decorator同时支持多个装饰器。

 

状态码处理规范建议

    网站常见的错误状态码有404(not found),403(authority),405(method),400(parameter),500(server),502(uwsgi)等,其中关于404和500错误的模板我们可以直接在templates文件夹下面创建,而其它的错误,我们可以创建一个app专门来处理这些错误。

    在开始写代码之前,我们需要将配置文件中的DEBUG = False和ALLOWED_HOSTS配置好,一般都是在生产环境下,才会用到错误处理,因为其它时候,我们需要DEBUG来返回错误信息给我们方便修改。当然TEMPLATES中的DIRS一般都已经配置好了吧,我的如下:

'DIRS': [BASE_DIR / 'templates'],

     在templates文件夹下面,新建404.html,当页面不存在时,则默认会展示404页面;新建500.html,可在视图中设置 c =2/0进行测试,需要注意,文件命名不能修改。

    其它的错误建议新建一个python包,如下路径,urls负责路由,views负责视图,关于为何在templates目录下面新建一个同名errors包,是因为Django默认按照INSTALLED_APPS中的添加顺序查找templates下的文件或文件夹,可以参考Django中文文档“编写你的第一个 Django 应用,第 3部分”中的为 URL 名称添加命名空间

errors
 │  urls.py
 │  views.py
 │  __init__.py
 │
 └─templates
     └─errors
             403.html

    另外,需要将errors包放在INSTALLED_APPS中,在主urls.py的urlpatterns中配置路径path('errors/', include('errors.urls')),这是一定要配置的(所有的url必须在主url中进行配置)

# errors/views.py
def view_403(req):
    return render(req, 'errors/403.html',status=403)
# errors/urls.py
app_name = 'errors'
urlpatterns = [
  path('403.html', views.view_403, name='view_403'),
]


配置相关视图来进行测试:

def test403(req):
    if req.method == 'GET':
        return redirect(reverse('errors:view_403'))
    else:
        return HttpResponse('test403')

当以get请求访问该页面时,就会返回403状态码了。