django的基本使用(一)

一、简介

现在在实际的项目开中分为两种开发模式:

1.前后端不分离

在运维开发的岗位中,前后端是否分离完全取决于技术人的决策。如果使用前后端不分离,在python语言中,基本就会用到django、flask框架的模板技术。前后端全部由后端框架(jango、flask)框架完成。如果功能比较简单还可以,如果功能非常复杂。前后端不分离的模式就有些不太合适了

2.前后端分离

在大型的项目开发中或者说企业级项目开发中,基本上都是前后端分离模式进行开发。也就是前端使用前端框架进行UI开发,比如vue、react等前端框架进行开发。后端使用python、go、java等语言相关的框架进行后端开发。个人感觉在运维开发岗中也应该使用前后端分离的模式进行开发。因为分离开,前端UI开发变得更加丰富,有很多丰富的UI组件库可以使用。还有就是分离开后,后端在更换开发语言、或者重构是比较方便的。

3.django简介

django是python的后端框架,相对于flask来讲是一个大而全的框架。很多功能都自带,如果要是进行web开发,建议使用django,如果不是非常复杂的功能、接口开发,首选flask,非常轻量化,非常的清爽。本文章对于django的知识点着重放在DRF上,对于模板语法不学习了,因为学习前端的vue框架已经是趋势,现在的岗位既要保证后端功能,又要保证UI的美观。

二、django安装

1.版本介绍

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

2.python版本

pyton 复制代码
(django_test) E:\code\project\后端项目\python_project\django_test>python -V
Python 3.8.10

3.安装

使用清华大学镜像站进行安装.

python 复制代码
pip install django==3.2.20  --index https://pypi.mirrors.ustc.edu.cn/simple/ 

如果想看到历史版本,可以在安装的时候指定一个不存在的版本,就会返回历史版本

python 复制代码
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

查看版本

python 复制代码
pip freeze |findstr /i django
Django==3.2.20

4.创建一个项目

创建语法: test1为项目名称。 加上./参数 不会重复创建目录

python 复制代码
django-admin startproject test1 ./

5.启动项目

c 复制代码
python manage.py runserver

6.项目根目录介绍

项目启动后,目录如下

c 复制代码
test1 
	__init__.py
	asgi.py      
	settings.py  #包含 Django 项目的配置信息,如数据库连接、静态文件路径等
	urls.py      #定义项目中的 URL 映射关系,将 URL 与视图函数或类绑定
	wsgi.py      #定义了 WSGI 接口,用于部署 Django 项目到生产服务器。
db.sqlite3
manage.py        #用于管理 Django 项目的命令行工具

7.创建应用

login为应用名称。应用会单独生成一个目录

c 复制代码
django-admin startapp login

7.1 应用目录介绍

c 复制代码
login 应用目录
    migrations 
    admin.py    
    apps.py    
    models.py   
    tests.py
    views.py   # 视图函数文件

7.2 应用注册

一个应用要想使用,必须需要注册到django中,编辑项目目录下的配置文件setting.py

c 复制代码
INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'login', # 将创建的login 应用注册到django中
]

三、django的基本使用

1.简单视图函数

django的视图函数必须在应用的views.py文件中创建。在login应用中编辑views.py

c 复制代码
from django.http import HttpResponse

# 视图函数的形参必须要加上request
def login(request):
    text = "<h1>登陆页面<h1>"
    return  HttpResponse(text)

2.路由配置

将用户的http请求通过路由配置转发到 视图函数中。

编辑项目根目录下的路由配置文件 url.py

c 复制代码
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),
]

测试:

c 复制代码
http://127.0.0.1:8000/login

这就是一个最简单的实例

四、路由

1.分布式路由

如果项目比较大,所有的路由全部写在主路由配置文件中会比较复杂,所有django提供了分布式路由

1.1.设置主路由

c 复制代码
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')),
]

1.2.设置子路由

在login应用下新建urls.py文件

c 复制代码
from django.urls import  path
# 导入视图函数
from .views import *


urlpatterns = [
    # 根路径路由设置
    path('', login),
]

1.3.视图函数

c 复制代码
from django.http import HttpResponse

def login(request):
    text = "<h1>登陆页面123<h1>"
    return  HttpResponse(text)

测试:再次访问127.0.0.1:8000/login

2.路由中的url参数

在url中可以使用 "<>"来定义URL参数,URL参数是URL中的变量部分。比如:用户下载不同的文件,因为文件有很多,所有无法提前确定用户下载的文件名是什么,所以将用户下载的文件名就可以在URL中定义为变量。

2.1 新建files应用

c 复制代码
django-admin startapp files

2.2 创建files应用路由

设置总路由

c 复制代码
from django.contrib import admin
from django.urls import path,include


urlpatterns = [
    path('files/',include('files.urls')),
]

设置子路由,在files应用下创建urls.py文件

c 复制代码
from django.urls import path
from .views import *

urlpatterns = [
    path('download/<str:filename>/',download),
]

2.3.视图函数

在视图函数中,除了必要的request形参外,需要加上url中传递过来的变量

注意:这里的filename变量名必须和url中定义的变量名一致

python 复制代码
from django.http import HttpResponse

def download(request,filename):
    return HttpResponse(filename)

视图类的写法.下边的视图中就会写到视图类知识

python 复制代码
from django.views import  View
from django.http import HttpResponse

class download(View):
    def get(self,request,filename):
        return HttpResponse(filename)

五、django视图

1.request

1.1 GET请求

方法 含义
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

视图函数实例

python 复制代码
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')

访问并传递参数:

c 复制代码
http://127.0.0.1:8000/login?name=zhangsan&name=lisi&passwd=123

结果如下:

c 复制代码
http请求方法: GET 
获取查询参数对象:<QueryDict: {'name': ['zhangsan', 'lisi'], 'passwd': ['123']}>
获取查询对象参数的某个值:lisi
获取所有相同名称的key列表:['zhangsan', 'lisi']

1.2 POST请求

表单类型数据,表单类型数据有两种:

一种是form-data数据: 上传内容既可以传文本,也可以传二进制数据(文件、视频、图片等)

一种是x-www-form-urlencoded数据: 上传的数据只能是符串或者数字,不可以是文件、视频、图片等

1.表单数据

在发送POST请求之前,禁用django的csrf设置。编辑setting.py文件

c 复制代码
MIDDLEWARE = [
    ......
    # 禁用这一行内容
    # 'django.middleware.csrf.CsrfViewMiddleware',
    ......
]

视图函数实例

python 复制代码
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

shell 复制代码
http://127.0.0.1:8000/login/

结果如下:

python 复制代码
http请求方法: POST 
<QueryDict: {'name': ['zhangsan']}> 
zhangsan
2.json数据

视图函数实例

python 复制代码
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数据,结果如下:

python 复制代码
http请求方法: POST 
<QueryDict: {}> 
获取表单数据的方法:None
获取json数据的方法{'name': 'zhangsan', 'password': 123, 'age': 20}

2.Response

2.1 返回字符串

201为自定义状态码

shell 复制代码
return  HttpResponse('Ok',201)

2.2 返回json数据

python 复制代码
from django.http import HttpResponse,JsonResponse
import json
data = {
    "code": "201",
    "message": "success"
}

def login(request):
    return  JsonResponse(data)

3.视图装饰器

视图装饰器的主要作用是,限制用户只能使用某种方法来访问此视图函数。当限制了用户使用特定的方法访问视图函数时,返回结果为405,而不在是500

c 复制代码
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")

4.视图类

django还给我们提供了另外一种和视图函数一样功能的方法,那就是"视图类"。

4.1 定义视图类

views.py文件内容如下

c 复制代码
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 方法')

4.2 定义视图类路由

总路由文件不见,编辑子路由,

c 复制代码
urlpatterns = [
    # 这里的as_view() 是固定写法。
    path('', login.as_view()),
]

as_view中的view函数做什么了事情?

1.每一次用户请求调用as_view函数的时候,as_view把view视图函数返回

2.view函数会根据请求生成对应的 "实例" ,这样的就用不同的 "实例" 区分出来的了不同的请求,也就是说区分出来了每一个独立的请求。也是是和普通视图函数最大的区别

3.最后在通过dispatch函数在派发到对应的 方法 上去

测试:

使用get和post方法访问

shell 复制代码
curl http://127.0.0.1:8000/login/
相关推荐
白拾12 分钟前
使用Conda管理python环境的指南
开发语言·python·conda
是刃小木啦~32 分钟前
三维模型点云化工具V1.0使用介绍:将三维模型进行点云化生成
python·软件工程·pyqt·工业软件
总裁余(余登武)38 分钟前
算法竞赛(Python)-万变中的不变“随机算法”
开发语言·python·算法
一个闪现必杀技44 分钟前
Python练习2
开发语言·python
Eric.Lee20211 小时前
音频文件重采样 - python 实现
人工智能·python·深度学习·算法·audio·音频重采样
大神薯条老师1 小时前
Python从入门到高手5.1节-Python简单数据类型
爬虫·python·深度学习·机器学习·数据分析
Mr.D学长1 小时前
毕业设计 深度学习社交距离检测系统(源码+论文)
python·毕业设计·毕设
姜学迁1 小时前
Rust-枚举
开发语言·后端·rust
wdxylb1 小时前
解决Python使用Selenium 时遇到网页 <body> 划不动的问题
python
代码骑士2 小时前
【一起学NLP】Chapter3-使用神经网络解决问题
python·神经网络·自然语言处理