Web应用模式
在开发Web应用中,有两种应用模式:前后端混合开发、前后端分离
前后端混合开发
后端人员:既要写后端,django,又要写前端
前后端分离
后端人员:只写后端,写一个个的API接口;前端人员,只写前端;最后项目写完,前后端连调
API接口
1.背景:为了在团队内部形成共识、防止个人习惯差异引起的混乱,我们需要找到一种大家都觉得很好的接口实现规范,而且这种规范能够让后端写的接口,用途一目了然,减少双方之间的合作成本。
2.API接口:通过网络,规定了前后台信息交互规则的url链接,也就是前后台信息交互的媒介
1.前端:向后端发送请求,获取数据 eg:127.0.0.1:8080/index --->返回数据
2.后端:请求某个地址,返回固定的数据
3.Web API接口和一般的url链接还是有区别的,Web API接口简单概括有下面四大特点
1.url链接--->127.0.0.1:8080/index
2.有不同的请求方式:get、post、put、patch、delete
3.请求参数--->127.0.0.1:8080/books?name=nana 放在请求体中
4.响应结果:json或xml格式的key-value类型数据
1.上方请求参数的output参数值决定了响应数据的格式
2.举例:
1.xml格式:
https://api.map.baidu.com/place/v2/search?ak=6E823f587c95f0148c19993539b99295®ion=%E4%B8%8A%E6%B5%B7&query=%E8%82%AF%E5%BE%B7%E5%9F%BA&output=xml
2.json格式
https://api.map.baidu.com/place/v2/search?ak=6E823f587c95f0148c19993539b99295®ion=%E4%B8%8A%E6%B5%B7&query=%E8%82%AF%E5%BE%B7%E5%9F%BA&output=json
接口测试工具:Postman
Postman是一款接口调试工具,是一款免费的可视化软件,同时支持各种操作系统平台,是测试接口的首选工具。Postman可以直接从官网:https://www.getpostman.com/downloads/下载获得,然后进行傻瓜式安装。
1.写好的接口,要测试,可以使用浏览器来做,但是浏览器只能发送get请求,接口有其他请求方式,就需要借助接口测试工具
2.专门的接口测试工具
1.postman:大部分公司用的,原来免费,后来收费
2.postwomen:免费的
3.apifox
使用
post请求的编码格式
1.post请求的编码格式
1.urlencoded --->默认的格式 b'k1=v1&k2=v2'
2.form-data --->传文件的格式,也可以传普通数据 b'----------------------------948273860232348624609515--\r\n'
3.json格式 --->只能传数据 b'{"k1":"v1","k2":"v2"}'
urlencode
def index(request):
# urlencoded --->b'hobby=read&gender=female'
# get请求 http://127.0.0.1:8000/index/?hobby=read&gender=female
print(request.POST) # <QueryDict: {}>
print(request.GET) # <QueryDict: {'hobby': ['read'], 'gender': ['female']}>
print(request.body) # b'hobby=read&gender=female'
# post请求
print(request.POST) # <QueryDict: {'hobby': ['read'], 'gender': ['female']}>
print(request.GET) # <QueryDict: {}>
print(request.body) # b'hobby=read&gender=female'
return JsonResponse({'name':'nana','age':18})
form-data
def form_data(request):
# form_data # b'----------------------------948273860232348624609515--\r\n'
print(request.POST) # <QueryDict: {'gender': ['male'], 'hobby': ['play']}>
print(request.GET) # <QueryDict: {}>
print(request.FILES) # <MultiValueDict: {'file': [<InMemoryUploadedFile: 77.PNG (image/png)>]}>
print(request.body) # b'----------------------------948273860232348624609515--\r\n'
return JsonResponse({'name':'cx','age':18})
json格式
def json1(request):
# json http://127.0.0.1:8000/json1/
print(request.POST) # <QueryDict: {}>
print(request.GET) # <QueryDict: {}>
print(request.body) # b'{"hobby":"listen","gender":"male"}'
import json
data_dic = json.loads(request.body)
print(data_dic) # {'hobby': 'listen', 'gender': 'male'}
hobby = data_dic.get('hobby')
print(hobby) # listen
gender = data_dic.get('gender')
print(gender) # male
return JsonResponse({'name': 'xiao', 'age': 18})
作业
写三个接口
-接收urlencoded格式的请求,post接口,把接收到的数据,后端打印
-接口form-data,把文件保存到本地,数据打印出来
-接收json形式,把数据打印出来
-json.loads(request.body)
import os
from django.shortcuts import render
from django.http import JsonResponse
from django.conf import settings
# Create your views here.
def index(request):
# urlencoded --->b'hobby=read&gender=female'
# get请求 http://127.0.0.1:8000/index/?hobby=read&gender=female
print(request.POST) # <QueryDict: {}>
print(request.GET) # <QueryDict: {'hobby': ['read'], 'gender': ['female']}>
print(request.body) # b'hobby=read&gender=female'
# post请求
print(request.POST) # <QueryDict: {'hobby': ['read'], 'gender': ['female']}>
print(request.GET) # <QueryDict: {}>
print(request.body) # b'hobby=read&gender=female'
return JsonResponse({'name':'nana','age':18})
def form_data(request):
# form_data # http://127.0.0.1:8000/form_data/
print(request.POST) # <QueryDict: {'gender': ['male'], 'hobby': ['play']}>
# print(request.GET) # <QueryDict: {}>
print(request.FILES) # <MultiValueDict: {'file': [<InMemoryUploadedFile: 77.PNG (image/png)>]}>
my_file = request.FILES.get('file')
print(my_file,type(my_file)) # 2.2.png <class 'django.core.files.uploadedfile.InMemoryUploadedFile'>
if my_file:
import os
img_file = os.path.join(settings.BASE_DIR,'static','img',my_file.name)
print(type(img_file))
with open(img_file,'wb')as f:
for chunk in my_file.chunks():
f.write(chunk)
else:
print('还没有文件上传')
"""
处理上传的文件
从request.FILES中获得的真实的文件。这个字典的每个输入都是一个UploadedFile对象——一个上传之后的文件的简单的包装。
你通常会使用下面的几个方法来访问被上传的内容:
UploadedFile.read():从文件中读取整个上传的数据。小心整个方法:如果这个文件很大,你把它读到内存中会弄慢你的系统。你可以想要使用chunks()来代替,看下面;
UploadedFile.chunks():如果上传的文件足够大需要分块就返回真。默认的这个值是2.5M,当然这个值是可以调节的。
"""
# print(request.body) # b'----------------------------948273860232348624609515--\r\n'
return JsonResponse({'name':'cx','age':18})
def json1(request):
# json http://127.0.0.1:8000/json1/
print(request.POST) # <QueryDict: {}>
print(request.GET) # <QueryDict: {}>
print(request.body) # b'{"hobby":"listen","gender":"male"}'
import json
data_dic = json.loads(request.body)
print(data_dic) # {'hobby': 'listen', 'gender': 'male'}
hobby = data_dic.get('hobby')
print(hobby) # listen
gender = data_dic.get('gender')
print(gender) # male
return JsonResponse({'name': 'xiao', 'age': 18})
Django的文件上传与下载:cloud.tencent.com/developer/a…