前言:
1、描述两种开发模式的区别:
1.1、前后端分离:
- 前端和后端分别由不同的开发人员开发维护;
- 前端可以通过调用接口获取后端返回的数据 展示动态的数据;
- 出现问题容易区分责任;
- 前后端解耦合,可以同时开发,提高开发效率;
- 一个后台即可满足网站、app、小程序等多种应用的需要
1.2、前后端不分离:
- 前端和后端不分别由相同的开发人员开发维护;
- 客户端只需要请求不同的页面,服务器会完成页面上的所有数据逻辑,所以 http 请求次数较少;
- 出现问题不容易区分责任;
- 每个请求都是一个 HTML,会有大量的冗余数据;
- 响应数据是 HTML,只能适应单一客户端,当需要多端支持时如要单独开发
2、Django中前端向后端传参的方式有哪些? 后端如何接收?
-
前端向后端传参的方式: 前端可以通过不同类型的请求(get\post\put等)向后端传递参数:1、body中form表单;2、body中json数据;3、body中file文件;4、param传参:url后面直接拼接(url?参数1&参数2)
- 后端如何接收
- 后端通过前端发起的ajax请求,从数据库读取数据后以json格式的方式返回给前端
先明白一个名词
什么是路由? url与后端视图的一一映射关系
- 类似于导航
- 类似于路由器
主路由在项目同名目录下的urls.py文件中定义,是Django解析路由的入口
一、路由的配置:
全局路由表:
urlpatterns = [
# path('admin/', admin.site.urls),
path('projects/',include('projects.urls')),
path('projects/',index1),
# path('interface/',include('interfaces.urls'))
]
projects应用中子路由的urls.py
urlpatterns = [
# path('admin/', admin.site.urls),
path('index1/',index1),
re_path('^index2/$',index2)
]
说明: 1.urlpatterns为名称固定的列表 2.列表中一个元素,代表一条路由 3.定义路由 方式一:(使用path函数) a.调用path函数,第一个参数为url路径字符串(去除http://ip:port/) b.不能以斜杠开头 c.第二个参数可以为需要调用的视图函数名(不可以加括号) 方式二:(使用re_path) a.re_path, 第一个参数为url路径字符串(正则表达式,一定要有^和$) b.第二个参数可以为需要调用的视图函数名(不可以加括号)
还有种引用视图函数的方法是,在子路由文件中直接导入views文件
from django.urls import path, re_path
from projects.views import index1, index2,MyView
#导入views视图文件
from projects import views
urlpatterns = [
# path('admin/', admin.site.urls),
path('index1/', index1),
#第二个参数使用views.视图函数
path('index1/', views.index1),
re_path('^index2/$', index2),
]
4.匹配规则 a.列表中的元素,从上到下进行匹配 b.一旦匹配成功,停止匹配,会自动调用path(re_path)函数的第二个参数指定的函数 c.如果匹配不成功,会继续往下匹配 d.如果所有的路由都匹配不上,那么会抛出一个404页面(404异常)
5.子路由 a.可以在子应用中定义子路由urls.py文件 b.path函数第二个参数需要调用include函数 c.include函数的第一个参数为子路由文件的路径字符串,'子应用名.urls' e.如果能匹配成功,会自动进入到子路由中去匹配 f.如果匹配不成功,那么会继续往下匹配
二、视图
定义:类似于MVC模式中的C控制器,主要用于业务逻辑的处理。
projects应用的views.py
views视图文件里写了我们接口的处理逻辑,并且需要返回的结果;
这里我们定义了3个视图函数,index1/index2是对index视图函数的改写
from django.shortcuts import render
import requests
from django.http import HttpResponse, JsonResponse
from rest_framework.response import Response
# Create your views here.
def index(request):
return HttpResponse('哈喽大佬,我是HttpResponse')
#根据不同请求类型,返回不同的json数据
def index1(request):
if request.method.upper() == 'GET':
return JsonResponse("哈哈哈哈,我是get请求数据!!!",safe=False)
elif request.method.upper() == 'POST':
return JsonResponse("嘿嘿嘿,我是post请求返回数据",safe=False)
else:
return JsonResponse("我是其他请求返回数据",safe=False)
def index2(request):
if request.method.upper() == 'GET':
return JsonResponse("哈哈哈哈,我是index2的get请求数据!!!",safe=False)
elif request.method.upper() == 'POST':
return JsonResponse("嘿嘿嘿,我是index2的post请求返回数据",safe=False)
else:
return JsonResponse("我是index2的其他请求返回数据",safe=False)
- index视图函数:
- 视图函数的第一个参数是HttpRequest对象或者子类对象
- WSGIRequest是HttpRequest子类
- 一定要返回一个HttpResponse对象或者子类对象
当使用postman工具请求对应的路由地址时,返回了对应视图函数的json格式结果数据 :
当我们请求另一个路由时:http://127.0.0.1:8000/projects/index2/ ,返回了对应视图函数的返回值