现在在实际的项目开中分为两种开发模式:
在运维开发的岗位中,前后端是否分离完全取决于技术人的决策。如果使用前后端不分离,在python语言中,基本就会用到django、flask框架的模板技术。前后端全部由后端框架(jango、flask)框架完成。如果功能比较简单还可以,如果功能非常复杂。前后端不分离的模式就有些不太合适了
在大型的项目开发中或者说企业级项目开发中,基本上都是前后端分离模式进行开发。也就是前端使用前端框架进行UI开发,比如vue、react等前端框架进行开发。后端使用python、go、java等语言相关的框架进行后端开发。个人感觉在运维开发岗中也应该使用前后端分离的模式进行开发。因为分离开,前端UI开发变得更加丰富,有很多丰富的UI组件库可以使用。还有就是分离开后,后端在更换开发语言、或者重构是比较方便的。
django是python的后端框架,相对于flask来讲是一个大而全的框架。很多功能都自带,如果要是进行web开发,建议使用django,如果不是非常复杂的功能、接口开发,首选flask,非常轻量化,非常的清爽。本文章对于django的知识点着重放在DRF上,对于模板语法不学习了,因为学习前端的vue框架已经是趋势,现在的岗位既要保证后端功能,又要保证UI的美观。
django的几个长期维护(LTS)版本
Django版本 | 起始维护时间 | Python版本 |
---|---|---|
1.11(LTS) | 2017.4—2020.4 | 2.7、3.4、3.5、3.6、3.7 |
2.2(LTS) | 2019.4—2022.4 | 3.5、3.6、3.7、3.8 |
3.2(LTS) | 2021.4—2024.4 | 3.6、3.7、3.8、3.9、3.10 |
4.2(LTS) | 2023.4—2026.4 | 3.9、3.10 |
(django_test) E:\code\project\后端项目\python_project\django_test>python -V
Python 3.8.10
使用清华大学镜像站进行安装.
pip install django==3.2.20 --index https://pypi.mirrors.ustc.edu.cn/simple/
如果想看到历史版本,可以在安装的时候指定一个不存在的版本,就会返回历史版本
pip install django==10.1.1 --index https://pypi.mirrors.ustc.edu.cn/simple/
返回结果如下:
ERROR: Could not find a version that satisfies the requirement django==10.1.1 (from versions: 1.1.3, 1.1.4, 1.2, 1.2.1, 1.2.2, 1.2.3, 1.2.4, 1.2.5, 1.2.6, 1.2.7, ......4.2.1, 4.2.2, 4.2.3, 4.2.4, 4.2.5, 4.2.6, 4.2.7, 4.2.8, 4.2.9)
ERROR: No matching distribution found for django==10.1.1
查看版本
pip freeze |findstr /i django
Django==3.2.20
创建语法: test1为项目名称。 加上./参数 不会重复创建目录
django-admin startproject test1 ./
python manage.py runserver
项目启动后,目录如下
test1
__init__.py
asgi.py
settings.py #包含 Django 项目的配置信息,如数据库连接、静态文件路径等
urls.py #定义项目中的 URL 映射关系,将 URL 与视图函数或类绑定
wsgi.py #定义了 WSGI 接口,用于部署 Django 项目到生产服务器。
db.sqlite3
manage.py #用于管理 Django 项目的命令行工具
login为应用名称。应用会单独生成一个目录
django-admin startapp login
login 应用目录
migrations
admin.py
apps.py
models.py
tests.py
views.py # 视图函数文件
一个应用要想使用,必须需要注册到django中,编辑项目目录下的配置文件setting.py
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'login', # 将创建的login 应用注册到django中
]
django的视图函数必须在应用的views.py文件中创建。在login应用中编辑views.py
from django.http import HttpResponse
# 视图函数的形参必须要加上request
def login(request):
text = "登陆页面"
return HttpResponse(text)
将用户的http请求通过路由配置转发到 视图函数中。
编辑项目根目录下的路由配置文件 url.py
from django.contrib import admin
from django.urls import path
# 导入视图函数
from login.views import login
urlpatterns = [
path('admin/', admin.site.urls),
# 配置路由,与视图函数对应, 这里的url后边一定要加上/,
path('login/',login),
]
测试:
http://127.0.0.1:8000/login
这就是一个最简单的实例
如果项目比较大,所有的路由全部写在主路由配置文件中会比较复杂,所有django提供了分布式路由
from django.contrib import admin
# 导入include方法
from django.urls import path,include
urlpatterns = [
path('admin/', admin.site.urls),
#将 用户访问login的路由转发到login应用的urls文件当中
path('login/',include('login.urls')),
]
在login应用下新建urls.py文件
from django.urls import path
# 导入视图函数
from .views import *
urlpatterns = [
# 根路径路由设置
path('', login),
]
from django.http import HttpResponse
def login(request):
text = "登陆页面123"
return HttpResponse(text)
测试:再次访问127.0.0.1:8000/login
在url中可以使用 "<>"来定义URL参数,URL参数是URL中的变量部分。比如:用户下载不同的文件,因为文件有很多,所有无法提前确定用户下载的文件名是什么,所以将用户下载的文件名就可以在URL中定义为变量。
django-admin startapp files
设置总路由
from django.contrib import admin
from django.urls import path,include
urlpatterns = [
path('files/',include('files.urls')),
]
设置子路由,在files应用下创建urls.py文件
from django.urls import path
from .views import *
urlpatterns = [
path('download//' ,download),
]
在视图函数中,除了必要的request形参外,需要加上url中传递过来的变量
注意:这里的filename变量名必须和url中定义的变量名一致
from django.http import HttpResponse
def download(request,filename):
return HttpResponse(filename)
视图类的写法.下边的视图中就会写到视图类知识
from django.views import View
from django.http import HttpResponse
class download(View):
def get(self,request,filename):
return HttpResponse(filename)
方法 | 含义 |
---|---|
request.method | 获取http请求方法 |
request.GET | 获取get方法所有参数 |
request.GET.get(‘key’) | 获取get方法才参数的某个key值 |
request.Get.getlist(‘key’) | 如果get方法有多个相同的key,将会全部取出 |
request.POST | 获取POST所有数据 |
request.POST.get(‘key’) | 获取post方法的某个数据 |
request.path | 获取url |
视图函数实例
from django.http import HttpResponse
def login(request):
print(request.method)
print(request.GET)
print(request.GET.get('name'))
print(request.GET.getlist('name'))
return HttpResponse('Ok')
访问并传递参数:
http://127.0.0.1:8000/login?name=zhangsan&name=lisi&passwd=123
结果如下:
http请求方法: GET
获取查询参数对象:<QueryDict: {'name': ['zhangsan', 'lisi'], 'passwd': ['123']}>
获取查询对象参数的某个值:lisi
获取所有相同名称的key列表:['zhangsan', 'lisi']
表单类型数据,表单类型数据有两种:
一种是form-data数据: 上传内容既可以传文本,也可以传二进制数据(文件、视频、图片等)
一种是x-www-form-urlencoded数据: 上传的数据只能是符串或者数字,不可以是文件、视频、图片等
在发送POST请求之前,禁用django的csrf设置。编辑setting.py文件
MIDDLEWARE = [
......
# 禁用这一行内容
# 'django.middleware.csrf.CsrfViewMiddleware',
......
]
视图函数实例
from django.http import HttpResponse
def login(request):
print('http请求方法: {}'.format(request.method))
print(request.POST)
print(request.POST.get('name'))
return HttpResponse('Ok')
使用postman 访问url。body中的form-data 参数设置name为zhangsan
http://127.0.0.1:8000/login/
结果如下:
http请求方法: POST
<QueryDict: {'name': ['zhangsan']}>
zhangsan
视图函数实例
from django.http import HttpResponse
import json
def login(request):
print('http请求方法: {}'.format(request.method))
print(request.POST)
print("获取表单数据的方法:{}".format(request.POST.get('name')))
print("获取json数据的方法{}".format(json.loads(request.body)))
return HttpResponse('Ok')
postman提交json数据,结果如下:
http请求方法: POST
<QueryDict: {}>
获取表单数据的方法:None
获取json数据的方法{'name': 'zhangsan', 'password': 123, 'age': 20}
201为自定义状态码
return HttpResponse('Ok',201)
from django.http import HttpResponse,JsonResponse
import json
data = {
"code": "201",
"message": "success"
}
def login(request):
return JsonResponse(data)
视图装饰器的主要作用是,限制用户只能使用某种方法来访问此视图函数。当限制了用户使用特定的方法访问视图函数时,返回结果为405,而不在是500
from django.views.decorators.http import require_http_methods,require_GET,require_POST
# @require_GET 或者@require_POST 或者 @require_http_methods(['GET','POST'])
@require_POST
def login(request):
return HttpResponse("ok")
django还给我们提供了另外一种和视图函数一样功能的方法,那就是"视图类"。
views.py文件内容如下
from django.http import HttpResponse
# 导入视图类
from django.views import View
# 自定义的视图类必须要继承VIew这个基类.
# 类中的方法名字就是用户用什么method方法请求的,并且必须使用小写
class login(View):
def get(self,request):
return HttpResponse('get方法')
def post(self,request):
return HttpResponse('post 方法')
总路由文件不见,编辑子路由,
urlpatterns = [
# 这里的as_view() 是固定写法。
path('', login.as_view()),
]
as_view中的view函数做什么了事情?
1.每一次用户请求调用as_view函数的时候,as_view把view视图函数返回
2.view函数会根据请求生成对应的 “实例” ,这样的就用不同的 “实例” 区分出来的了不同的请求,也就是说区分出来了每一个独立的请求。也是是和普通视图函数最大的区别
3.最后在通过dispatch函数在派发到对应的 方法 上去
测试:
使用get和post方法访问
curl http://127.0.0.1:8000/login/