django项目中,需要在views.py里面定义函数,然后需要在urls.py里面把url和函数名对应起来。但是,其实这个函数的函数名叫什么是不重要的,这样只是多了一层映射而已。
所以,我们可以定义以下的装饰器:
# views.py
from django.conf.urls import url
from django.http import JsonResponse
urlpatterns = []
def register_view(url_pattern, method_name, register_list):
def decorator(func):
# url parameter like (?P<contest_id>[0-9]+) is stored in kwargs
def custom_view(request, *args, **kwargs):
#check method name
if request.method.lower() != method_name.lower():
return JsonResponse({'errors':f"http method {request.method} not allowed "})
return func(request, *args, **kwargs)
nonlocal register_list
register_list += [url(url_pattern, custom_view)]
return custom_view
return decorator
@register_view(url_pattern=r'aaa', method_name='get', register_list=urlpatterns)
def name_is_not_important(request):
return JsonResponse({'a':12})
#urls.py
from .view import urlpatterns
也就是说,我们关心的只是一个url对应的函数怎么处理,如此,添加一个view只需要在一个文件里面修改。
网友评论