关于django的视图、url新的CBV思想

CBV思想:

这里的CBV思想是指:class  base  view ,类基于视图。之前我们写的视图是用函数式编程,通过url.conf里的url 映射到view里的函数,如下:

1   url(r'^service_do/', views.service),

然后views.py里的对应的函数:

1 def service(request):
2     return  render(request, 'task/self_service.html')

如上是简单的请求,并返回一个页面,默认情况是get请求,当然如果我们进行post请求的时候,需要做如下判断:

1 if request.method=='POST':
2      pass

如果做delet请求呢?还需要做其他if判断。。。。。

最后对应函数会变成一堆if判断。。。。。来判断客户端请求的方法。而不是通过反射来进行请求的转发的。显的笨拙!

基于这些,种种,django推出一个CBV的方式,根据用户的请求方法,由django来判断执行类中那些方法,比如说是get请求,自动触发get函数,delete请求,触发delete方法。。。。。。。

这看起来是不是很叼,看起来是不是更符合RESTAPI的思想?

来我们一起研究下,这种CBV方法,官网地址:https://docs.djangoproject.com/en/1.10/ref/class-based-views/base/

django版本要求:Django 1.10

语法:

视图文件中需要导入如下:

1 from django.http import HttpResponse
2from  django.views.generic import ListView
这个就是cbv需要导入的类

其次url.conf写我们的对应的url对应:

1 from django.conf.urls import url
2 
3 from myapp.views import ListView
4 5 urlpatterns = [ 6 url(r'^mine/$', MyView.as_view(), name='my-view'), 7 ]

 其中:MyView.as_view()需要声明:类名作为我们的视图处理。MyView是我们在视图中定义的类名,需要注意的是 该类需要继承类:ListView

组合一起视图中代码如下:

1 from django.http import HttpResponse
2 from  django.views.generic import ListView
3 
4 class MyView(ListView):
5
6   def get(self, request, *args, **kwargs):
7     return HttpResponse('Hello, World!')

其中类中方法:

1 ['get', 'post', 'put', 'patch', 'delete', 'head', 'options', 'trace'] 

即需要在类中定义相应的方法。表示客户端请求方式不同,反射到不同的方法。这样看起来 整个视图的代码更加整洁和简洁。

类似如下:根据客户端请求方式反射到不同的方法。

 1 class MyView(View):
 2 
 3     def get(self, request, *args, **kwargs):
 4         return HttpResponse('Hello, World!')
 5     def post(self, request, *args, **kwargs):
 6         return HttpResponse('Hello, World!')
 7     def put(self, request, *args, **kwargs):
 8         return HttpResponse('Hello, World!')
 9     def delete(self, request, *args, **kwargs):
10         return HttpResponse('Hello, World!')

 完整的例子:

 1 class Data_Deal(ListView):
 2     def __init__(self):
 3         super(ListView, self).__init__()
 4         self.resp_msg={'sucess':None,'fail':None,'Msg':None}
 5     def post(self,request):
 6         brok_name=request.POST.get('brok_name',None)
 7         brok_deal=request.POST.get('brok_deal',None)
 8         brok_efffect=request.POST.get('brok_efffect',None)
 9         brok_promot=request.POST.get('brok_promot',None)
10         brok_yw_time=request.POST.get('brok_yw_time',None)
11         brok_deal_time=request.POST.get('brok_deal_time',None)
12         brok_time=request.POST.get('brok_time',None)
13         bro_reason=request.POST.get('bro_reason',None)
14         if  not  brok_time:
15             brok_time=time.strftime("%Y-%m-%d %H:%M:%S",time.localtime(time.time()))
16         # print(brok_name,brok_deal,brok_efffect,brok_promot,brok_yw_time,brok_deal_time)
17         models.Broker_Data.objects.create(
18             brok_name=brok_name,
19             brok_deal=brok_deal,
20             brok_efffect=brok_efffect,
21             brok_promot=brok_promot,
22             brok_yw_time=brok_yw_time,
23             brok_deal_time=brok_deal_time,
24             bro_reason=bro_reason,
25             brok_time=brok_time,
26         )
27         self.resp_msg['sucess']=True
28         return HttpResponse(json.dumps(self.resp_msg))

 

我们一般做前端页面请求的时候,是通过jquery的ajax方法进行请求。

我们在查看ajax的type的支持什么类型的时候:

并不是所有的浏览器支持 put、delet方法。

网上有些做了测试:其中如下浏览器支持这些方法

详细的测试地址:

http://www.cnblogs.com/snandy/archive/2012/04/20/2459065.html

也就是目前主流浏览器都支持'get', 'post', 'put', 'patch', 'delete', 'head', 'options', 'trace'请求方方法。可以放心使用!

posted @ 2017-03-06 14:56  evil_liu  阅读(149)  评论(0)    收藏  举报