类视图装饰器
之前,在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状态码了。