一 内容回顾
1 开发者模式
普通开发方式:前后端放在一起开发
前后端分离:前后端只通过 JSON 来交流,组件化、工程化不需要依赖后端去实现
2 后端开发:为前端提供url接口,也就是API或者接口的开发。永远返回HttpResponse。
3 django的FBC和CBV
FBV也就是:function base view的缩写,也就是视图函数。方法如下:
# def users(request): # user_list=[‘alex‘,‘oldboy‘,‘egon‘] # return HttpResponse(json.dumps(user_list))
CBV也就是:class base view的缩写,也就是类的视图。方法如下:
注:写的类需要继承View内置的类的方法。在url中使用:类名.as_view()
在views.py文件中:
View的导入:from django.views impost View
# class StudentView(View): # # def get(self,request,*args,**kwargs): # return HttpResponse(‘GET‘) # # def post(self,request,*args,**kwargs): # return HttpResponse(‘POST‘) # # def delete(self,request,*args,**kwargs): # return HttpResponse(‘DELETE‘) # # def put(self,request,*args,**kwargs): # return HttpResponse(‘PUT‘)
在url.py文件中:
url(r‘^student/‘, views.StudentView.as_view()),
CBV补充:CBV是基于反射实现根据请求方式不同,执行不同的方法。
原理:也就是执行的顺序是url -> view方法 -> dispatch方法(反射执行其他:GET/POST/DELETE/PUT)
流程如下:
class StudentView(View): def dispatch(self, request, *args, **kwargs): ret=super(StudentView,self).dispatch(request, *args, **kwargs) return ret def get(self,request,*args,**kwargs): return HttpResponse(‘GET‘) def post(self,request,*args,**kwargs): return HttpResponse("POST") def put(self,request,*args,**kwargs): return HttpResponse("PUST") def delete(self,request,*args,**kwargs): return HttpResponse(‘DELETE‘)
继承:多个类的共同功能,为了避免重复写代码,如下:
class MyBaseView: def dispatch(self,request,*args,**kwargs): print(‘before‘) ret=super(MyBaseView,self).dispatch(request,*args,**kwargs) print(‘after‘) return ret class StudentView(MyBaseView,View): def get(self,request,*args,**kwargs): print(‘get方法‘) return HttpResponse(‘GET‘) def put(self, request, *args, **kwargs): print(‘put方法‘) return HttpResponse(‘PUT‘) def post(self, request, *args, **kwargs): print(‘post方法‘) return HttpResponse(‘POST‘) def delete(self, request, *args, **kwargs): print(‘delete方法‘) return HttpResponse(‘DELETE‘)
4 列表生成式:
class Foo: def __init__(self): pass def work(self): print(‘this is working‘) class Bar: def __init__(self): pass def ect(self): print(‘this is ecting‘) objs=[item() for item in [Foo,Bar]] # 就相当于如下 # objs=[] # for i in [Foo,Bar]: # objs.append(i()) objs[0].work() objs[1].ect()
5 面向对象的封装:
1将共同的方法和属性封装到同一个类下面。
class File: 文件增删改查方法 Class DB: 数据库的方法
2 将数据封装到数据中。实例如下:
class File: def __init__(self,a1,a2): self.a1 = a1 self.xxx = a2 def get:... def delete:... def update:... def add:... obj1 = File(123,666) obj2 = File(456,999)
6 ps扩展:
class Request: def __init__(self,obj): self.obj=obj @property def user(self): return self.obj.authticate() class Auth: def __init__(self,name,age): self.name=name self.age=age def authticate(self): return self.name,self.age class APIView: def dispatch(self): return self.f2() def f2(self): a=Auth(‘alex‘,33) ret=Request(a) return ret.user obj=APIView() print(obj.dispatch())
二 中间件和csrf_token
1 django中csrf_token是怎么实现的:csrf_token是在process_view里面验证的。
2 解决csrf_token的方法:
2.1:直接在settings文件中将下面这行代码给注释掉
‘django.middleware.csrf.CsrfViewMiddleware‘,
2.2:通过csrf_exempt装饰器,将不需要csrf_token的试图函数上加上这个装饰器。process_view方法就会检查试图的cerf_token是否免除。
from django.views.decorators.csrf import csrf_exempt @csrf_exempt # def users(request): user_list=[‘alex‘,‘oldboy‘,‘egon‘] return HttpResponse(json.dumps(user_list))
2.3:类的视图如果需要免除csrf_token的验证,就需要在class类使用装饰器method_decorator。不过必须要加上dispatch这个方法。加在单独的方法上面无效。
使用方法一:直接加在类里面的dispatch方法上面
from django.views.decorators.csrf import csrf_exempt from django.utils.decorators import method_decorator # method_decorator 装饰器使用方法一: class StudentView(View): @method_decorator(csrf_exempt) def dispatch(self,request,*args,**kwargs): ret=super(StudentView,self).dispatch(request,*args,**kwargs) return ret def get(self,request,*args,**kwargs): return HttpResponse(‘GET‘) def post(self,request,*args,**kwargs): return HttpResponse(‘POST‘) def put(self,request,*args,**kwargs): return HttpResponse(‘PUT‘) def delete(self,request,*args,**kwargs): return HttpResponse(‘DELETE‘)
使用方法二:在class类上面加上这个装饰器,不过需要多创一个属性值,@method_decorator(csrf_token,name=‘dispatch‘)
# method_decorator 装饰器使用方法二: from django.views.decorators.csrf import csrf_exempt from django.utils.decorators import method_decorator @method_decorator(csrf_exempt,name=‘dispatch‘) class StudentView(View): def get(self, request, *args, **kwargs): return HttpResponse(‘GET‘) def post(self, request, *args, **kwargs): return HttpResponse(‘POST‘) def put(self, request, *args, **kwargs): return HttpResponse(‘PUT‘) def delete(self, request, *args, **kwargs): return HttpResponse(‘DELETE‘)
2.4 :csrf_protect装饰器,如果在settings文件中将‘django.middleware.csrf.CsrfViewMiddleware‘,这段代码注释掉了的话需要某个试图函数通过csrf_token的验证,就在这个视图函数上面加上这个装饰器。
from django.views.decorators.csrf import csrf_exempt @csrf_protect # 该函数需认证 def users(request): user_list = [‘alex‘,‘oldboy‘] return HttpResponse(json.dumps((user_list)))
3 django的中间件:如下
- process_request - process_view - process_response - process_exception - process_render_template
django的中间件做过什么:权限;用户认证。
process_view做过什么:检查视图是否被免除csrf_token的验证;去请求体的cookie中获取csrf_token
三 restful规范
什么是restful:
REST与技术无关,代表的是一种软件架构风格,REST是Representational State Transfer的简称,中文翻译为“表征状态转移” REST从资源的角度类审视整个网络,它将分布在网络中某个节点的资源通过URL进行标识,客户端应用通过URL来获取资源的表征,获得这些表征致使这些应用转变状态 REST与技术无关,代表的是一种软件架构风格,REST是Representational State Transfer的简称,中文翻译为“表征状态转移” 所有的数据,不过是通过网络获取的还是操作(增删改查)的数据,都是资源,将一切数据视为资源是REST区别与其他架构风格的最本质属性 对于REST这种面向资源的架构风格,有人提出一种全新的结构理念,即:面向资源架构(ROA:Resource Oriented Architecture)
restful是为了根据method的不同做这不同的操作。restful就是一个规范,只为了让我们更好的记住url。
restful的API的设计有哪些。如下:
1 API与用户的通信协议,总是使用HTTPs协议。
2 域名 :
https://api.example.com 尽量将API部署在专用域名(会存在跨域问题) https://example.org/api/ API很简单
3 版本:
URL,如:https://api.example.com/v1/ 请求头 跨域时,引发发送多次请求
4 路径,视网络上任何东西都是资源,均使用名词表示(可复数)
https://api.example.com/v1/zoos https://api.example.com/v1/animals https://api.example.com/v1/employees
5 method
GET :从服务器取出资源(一项或多项) POST :在服务器新建一个资源 PUT :在服务器更新资源(客户端提供改变后的完整资源) PATCH :在服务器更新资源(客户端提供改变的属性) DELETE :从服务器删除资源
6 过滤,通过在url上传参的形式传递搜索条件
https://api.example.com/v1/zoos?limit=10:指定返回记录的数量 https://api.example.com/v1/zoos?offset=10:指定返回记录的开始位置 https://api.example.com/v1/zoos?page=2&per_page=100:指定第几页,以及每页的记录数 https://api.example.com/v1/zoos?sortby=name&order=asc:指定返回结果按照哪个属性排序,以及排序顺序 https://api.example.com/v1/zoos?animal_type_id=1:指定筛选条件
7 状态码
200 OK - [GET]:服务器成功返回用户请求的数据,该操作是幂等的(Idempotent)。 201 CREATED - [POST/PUT/PATCH]:用户新建或修改数据成功。 202 Accepted - [*]:表示一个请求已经进入后台排队(异步任务) 204 NO CONTENT - [DELETE]:用户删除数据成功。 400 INVALID REQUEST - [POST/PUT/PATCH]:用户发出的请求有错误,服务器没有进行新建或修改数据的操作,该操作是幂等的。 401 Unauthorized - [*]:表示用户没有权限(令牌、用户名、密码错误)。 403 Forbidden - [*] 表示用户得到授权(与401错误相对),但是访问是被禁止的。 404 NOT FOUND - [*]:用户发出的请求针对的是不存在的记录,服务器没有进行操作,该操作是幂等的。 406 Not Acceptable - [GET]:用户请求的格式不可得(比如用户请求JSON格式,但是只有XML格式)。 410 Gone -[GET]:用户请求的资源被永久删除,且不会再得到的。 422 Unprocesable entity - [POST/PUT/PATCH] 当创建一个对象时,发生一个验证错误。 500 INTERNAL SERVER ERROR - [*]:服务器发生错误,用户将无法判断发出的请求是否成功。
http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html
8 错误处理,状态码是4xx时,应返回错误信息,error当做key。
{ error: "Invalid API key" }
9 返回结果,针对不同操作,服务器向用户返回的结果应该符合以下规范。
GET /collection:返回资源对象的列表(数组) GET /collection/resource:返回单个资源对象 POST /collection:返回新生成的资源对象 PUT /collection/resource:返回完整的资源对象 PATCH /collection/resource:返回完整的资源对象 DELETE /collection/resource:返回一个空文档
10 Hypermedia API,RESTful API最好做到Hypermedia,即返回结果中提供链接,连向其他API方法,使得用户不查文档,也知道下一步应该做什么。
{"link": { "rel": "collection https://www.example.com/zoos", "href": "https://api.example.com/zoos", "title": "List of zoos", "type": "application/vnd.yourformat+json" }}
借鉴:http://www.ruanyifeng.com/blog/2014/05/restful_api.html
四 restful的API面试解答
问题:请说一下你对restful的认识。
解答:
restful的API设计模式有API与用户的通信协议是基于HTTPs协议实现的,通过url传参的形式传递搜索条件的,还有错误处理等等。 在我没有遇到restful之前需要记住各种各样的很多的url路径,而且写的代码全是靠着试图函数给实现的,代码看起来不是很高端,并且等等 RESTful架构,是比较流行的一种互联网软件架构。REST,即Representational State Transfer的缩写。 说白点就是网站即软件,再白点就是一个服务软件支持http的四种方法: GET用来获取资源,POST用来新建资源、更新资源,PUT用来更新资源,DELETE用来删除资源。 在我遇到restful之后,不需要记住那么多的url,可以将共同的方法封装到一个类下面,通过调用在这个类的方法来访问url。并且API很好的解决了跨域的问题。版本有更新的时候,还可以将版本号写在url中来提示使用的版本。还可以自己写访问错误时返回的错误信息。传入参数时还可以通过url来传递参数等等,
借鉴 :
RESTful架构,目前是比较流行的一种互联网软件架构。REST,即Representational State Transfer的缩写。 说白点就是网站即软件,再白点就是一个服务软件支持http的四种方法: GET用来获取资源,POST用来新建资源、更新资源,PUT用来更新资源,DELETE用来删除资源。 并对外提供一个或多个URI,每个URI对应一个资源;客户端通过URI配合上面的方法就可以和服务 段的软件交互。客户端主要是浏览器,使用restful框架的软件对http的支持也为了web应用带来方便。 REST这个词,是Roy Thomas Fielding在他2000年的博士论文中提出的。他的贡献很多, 可以了解一下。本人工作的方向是SDN,也算是比较潮的东东,其中floodlight就用到了restful框架。 开发者为软件开发出一些功能,并提供URI api,用户就可以利用浏览器、curl等工具通过提供的URI 从软件中获得想要的信息或者设置软件的功能。 对于发开者来说,就是提供URI和URI对应的资源,并将他们对应上,类似dicts={‘/path?‘:resource}。 比如重写http GET方法:首先获得客户端请求的url,解析url然后判断其对应的URI,由于URI与应一个资源, 那么url就可以访问这个资源了。具体实现上资源也就是方法或者一个类,要看具体实现了。