目录
前台部分:
首先先在终端下载axios插件,插件被下载到node_modules文件夹内了,这样全局都能导出axios插件;以后只要有使用axios插件都要重新安装到当前项目内:
? cnmp install axios
// main.js
import axios from 'axios'
Vue.prototype.$axios = axios;
主页面
后台部分:
# settings.py 配置
INSTALLED_APPS = [
'corsheaders',
]
MIDDLEWARE = [
# 'django.middleware.csrf.CsrfViewMiddleware', # 注销掉
'corsheaders.middleware.CorsMiddleware' # 注册cors
]
# 打开跨域
CORS_ORIGIN_ALLOW_ALL = True
# 自己定义请求头,不适用系统的了,但要加上系统自带的
CORS_ALLOW_HEADERS = [
# 系统的
"accept",
"accept-encoding",
"authorization",
"content-type",
"dnt",
"origin",
"user-agent",
"x-csrftoken",
"x-requested-with",
# 自己定义的
"token",
"zhang",
]
#urls.py
from app01 import views
urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'^test/$', views.test),
]
from django.http import JsonResponse
# Create your views here.
def test(request):
import json
print(request.method)
print(request.GET) #
res=json.loads(request.body) # {'x': 10}
print(res)
print(request.META.get('HTTP_AUTHORIZATION')) # abc.def.xyz
return (JsonResponse('ok',safe=False))
前台headers内数据传到后台request.META中,META还携带有其他的参数,参看下图:
1) drf 是Django的插件,所以要提前安装Django;
2)安装命令:pip install restframework;
3) 使用drf时,要在settings注册; import rest_framework
通过网络,规定了前后台信息交互规则的url链接,也就是前后台信息交互的媒介
Web API接口和一般的url链接还是有区别的,Web API接口简单概括有下面四大特点
什么是接口?===>url链接
采用某种请求方式提交参数,获得响应的响应数据结果的url链接
https://www.baidu.com # 网址
https://www.baidu.com/search
四部分:url链接+请求方式+请求参数+相应数据{
"status":0,
"message":"ok",
"results":[
{
"name":"肯德基(罗餐厅)",
"location":{
"lat":31.415354,
"lng":121.357339
},
"address":"月罗路2380号",
"province":"上海市",
"city":"上海市",
"area":"宝山区",
"street_id":"339ed41ae1d6dc320a5cb37c",
"telephone":"(021)56761006",
"detail":1,
"uid":"339ed41ae1d6dc320a5cb37c"
}
...
]
}
'''
一个开源可视化接口管理平台,YApi项目可以搭建在任何本地或云服务器上,完成后台项目开发时的接口编写。为开发。测试等人员提供可视化的接口预览
'''
从这里进去:yapi测试网站
个人账户:zhangchao 密码:与相关一致
用上面数据写出的一个小示例:
这里下载:点击进入下载
下载完毕,在双击安装的时候遇到了一个错误,如下:
需要网上下载一个系统配置:
解决办法:
1.安装系统更新补丁KB2533623,下载地址:
安装之后双击电脑会自动更新配置,之后再重新启动电脑即可。
postman测试后台数据的界面解释:
点击这里看重点:restful更多规范
url链接:
1)接口都是操作前后台数据的,所以需要保证数据的安全性的
采用https协议
2)接口用来操作数据,与网址(操作页面)有区别,所以用特定的关键字表示接口;
API关键字
-https://api.baidu.com
-https://www.baidu/api
3) 接口操作的数据称之为 资源,在url中只体现资源 名称(空间),不体现操作资源的方式动词常规接口:
- https://api.baidu.com/books/
- https://api.baidu.com/books/(pk)/
非常规接口 :和某资源不是特别密切或者不是一种资源
- https://api.baidu.com/login/
- https://api.baidu.com/place/search/
4)如果一个资源存在多版本结果,在url链接中要用特定符号来兼容多版本共存;
v1|v2
- https://api.baidu.com/v1/books/
- https://api.baidu.com/v2/books/
5) 群资源操作,一般还有额外的限制条件,如排序、限制调试、分页等等;
?限制条件
- https://api.baidu.com/v1/books/?ordering=-price&limit=3
6) 五大请求方式:
get:获取单个或多个资源
- https://api.baidu.com/books/ ==>群查,返回多个结果对象
- https://api.baidu.com/books/(pk)/ ==>单查,返回单个结果对象
post:新增单个或多个资源
- https://api.baidu.com/books/
单增:提交单个数据字典,完成单增,返回单个结果对象
群增:提供多个数据字典的数组,完成群增,返回多个结果对象
put:整体修改单个或多个资源
- https://api.baidu.com/books/(pk)/
整体修改单个,提供单个数据字典(主键在url中体现),完成单改,返回单个结果对象
patch:局部修改单个或多个资源
方式与put完全相同,不同的是:操作的资源如果有5个key-value键值对,put请求提供的字典必须全包含,但是patch提供的字典包含的键值对0-5都可以
delete:删除单个或多个资源
-https://api.baidu.com/books/
多删:提供多个资源主键数据,完成群删,不做任何资源返回(一般我们会返回结果信息:成功|失败)
单删:不需要提供额外数据,完成单删,不做任何资源返回(一般我们会返回结果信息:成功|失败)
响应结果:
7)响应对象中要包含网络状态码(网络状态信息和网络状态码捆绑出现,不要额外设置):
1xx:基本信息
2xx:成功 - 200 基本 201新增成功
3xx:重定向
4xx:客户端错误 - 400错误请求;403请求无权限;404请求资源不存在;
5xx:服务端错误 - 500服务器错误
8) 数据状态码(一般都是前后台约定规则)
0:成功
1:失败 - 1xx:具体失败信息(要再接口文档中明确写出)
2:无数据 -2xx:具体无数据信息(要在接口文档中明确写出)
9)数据状态信息(一般不仅仅是对数据状态码的解释,更是对结果的描述,给前台开发者阅读的)
10)数据结果(常量、数组、字典),如果有子资源(图片、音频、视频),返回资源的url链接;
'''
{
"status":0,
"msg":'ok',
"results":[{
"name":"西游记",
"img":"https://api.baidu.com/media/book/xyj.png"
}]
}
'''
一个视图类可以包括五个常规请求方法:get|post|put|patch|delete
五个请求方法处理十个资源操作的逻辑:单群查|单群增|单群整体改|单群局部改|单群删
# d_proj(app)>urls.py
# 总路由路由分发
from django.conf.urls import url,include
from app import views
urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'^api/',include('api.urls')),
]
# api(app)>urls.py
from django.conf.urls import url
from . import views
urlpatterns = [
url(r'^books/$', views.BookView.as_view()),
url(r'^books/(?P\d+)/$', views.BookView.as_view()),
]
#api(app)views.py
from django.http import JsonResponse
from django.views import View
from . import models
class BookView(View):
def _single_get(self, pk):
book_dic = models.Book.objects.filter(pk=pk).values('name', 'price').first()
if not book_dic:
return JsonResponse({
'status': 1,
'msg': '单查 资源不存在',
})
return JsonResponse({
'status': 0,
'msg': '单查 ok',
'results': book_dic
})
def _many_get(self):
book_query = models.Book.objects.values('name', 'price')
book_list = list(book_query)
return JsonResponse({
'status': 0,
'msg': '群查 ok',
'results': book_list
})
def get(self, request, *args, **kwargs):
pk = kwargs.get('pk')
if pk: # 单查
return self._single_get(pk)
else: # 群查
return self._many_get()
def post(self, request, *args, **kwargs):
return JsonResponse({
'status': 0,
'msg': 'post ok'
})
def put(self, request, *args, **kwargs):
return JsonResponse({
'status': 0,
'msg': 'put ok'
})
def patch(self, request, *args, **kwargs):
return JsonResponse({
'status': 0,
'msg': 'patch ok'
})
def delete(self, request, *args, **kwargs):
return JsonResponse({
'status': 0,
'msg': 'delete ok'
})
不会使用debug就不是一个合格的开发!!!!
Django-restframework框架01