当前位置:   article > 正文

django的基本使用(一)

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.42.7、3.4、3.5、3.6、3.7
2.2(LTS)2019.4—2022.43.5、3.6、3.7、3.8
3.2(LTS)2021.4—2024.43.6、3.7、3.8、3.9、3.10
4.2(LTS)2023.4—2026.43.9、3.10

2.python版本

(django_test) E:\code\project\后端项目\python_project\django_test>python -V
Python 3.8.10
  • 1
  • 2

3.安装

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

pip install django==3.2.20  --index https://pypi.mirrors.ustc.edu.cn/simple/ 
  • 1

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

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
  • 1
  • 2
  • 3
  • 4
  • 5

查看版本

pip freeze |findstr /i django
Django==3.2.20
  • 1
  • 2

4.创建一个项目

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

django-admin startproject test1 ./
  • 1

5.启动项目

python manage.py runserver
  • 1

6.项目根目录介绍

项目启动后,目录如下

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

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

7.创建应用

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

django-admin startapp login
  • 1

7.1 应用目录介绍

login 应用目录
    migrations 
    admin.py    
    apps.py    
    models.py   
    tests.py
    views.py   # 视图函数文件
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

7.2 应用注册

一个应用要想使用,必须需要注册到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中
]

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

三、django的基本使用

1.简单视图函数

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

from django.http import HttpResponse

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

2.路由配置

将用户的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),
]
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

测试:

http://127.0.0.1:8000/login
  • 1

这就是一个最简单的实例

四、路由

1.分布式路由

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

1.1.设置主路由

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
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

1.2.设置子路由

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

from django.urls import  path
# 导入视图函数
from .views import *


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

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

1.3.视图函数

from django.http import HttpResponse

def login(request):
    text = "<h1>登陆页面123<h1>"
    return  HttpResponse(text)
  • 1
  • 2
  • 3
  • 4
  • 5

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

2.路由中的url参数

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

2.1 新建files应用

django-admin startapp files
  • 1

2.2 创建files应用路由

设置总路由

from django.contrib import admin
from django.urls import path,include


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

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

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

from django.urls import path
from .views import *

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

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

2.3.视图函数

在视图函数中,除了必要的request形参外,需要加上url中传递过来的变量
注意:这里的filename变量名必须和url中定义的变量名一致

from django.http import HttpResponse

def download(request,filename):
    return HttpResponse(filename)
  • 1
  • 2
  • 3
  • 4

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

from django.views import  View
from django.http import HttpResponse

class download(View):
    def get(self,request,filename):
        return HttpResponse(filename)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

五、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

视图函数实例

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')
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

访问并传递参数:

http://127.0.0.1:8000/login?name=zhangsan&name=lisi&passwd=123
  • 1

结果如下:

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

1.2 POST请求

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

一种是form-data数据: 上传内容既可以传文本,也可以传二进制数据(文件、视频、图片等)
一种是x-www-form-urlencoded数据: 上传的数据只能是符串或者数字,不可以是文件、视频、图片等

1.表单数据

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

MIDDLEWARE = [
    ......
    # 禁用这一行内容
    # 'django.middleware.csrf.CsrfViewMiddleware',
    ......
]
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

视图函数实例

from django.http import HttpResponse

def login(request):
    print('http请求方法: {}'.format(request.method))
    print(request.POST)
    print(request.POST.get('name'))
    return  HttpResponse('Ok')
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

使用postman 访问url。body中的form-data 参数设置name为zhangsan

http://127.0.0.1:8000/login/
  • 1

结果如下:

http请求方法: POST 
<QueryDict: {'name': ['zhangsan']}> 
zhangsan
  • 1
  • 2
  • 3
2.json数据

视图函数实例

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')
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

postman提交json数据,结果如下:

http请求方法: POST 
<QueryDict: {}> 
获取表单数据的方法:None
获取json数据的方法{'name': 'zhangsan', 'password': 123, 'age': 20}
  • 1
  • 2
  • 3
  • 4

2.Response

2.1 返回字符串

201为自定义状态码

return  HttpResponse('Ok',201)
  • 1

2.2 返回json数据

from django.http import HttpResponse,JsonResponse
import json
data = {
    "code": "201",
    "message": "success"
}

def login(request):
    return  JsonResponse(data)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

3.视图装饰器

视图装饰器的主要作用是,限制用户只能使用某种方法来访问此视图函数。当限制了用户使用特定的方法访问视图函数时,返回结果为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")
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

4.视图类

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

4.1 定义视图类

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 方法')
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

4.2 定义视图类路由

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

urlpatterns = [
    # 这里的as_view() 是固定写法。
    path('', login.as_view()),
]
  • 1
  • 2
  • 3
  • 4

as_view中的view函数做什么了事情?
1.每一次用户请求调用as_view函数的时候,as_view把view视图函数返回
2.view函数会根据请求生成对应的 “实例” ,这样的就用不同的 “实例” 区分出来的了不同的请求,也就是说区分出来了每一个独立的请求。也是是和普通视图函数最大的区别
3.最后在通过dispatch函数在派发到对应的 方法 上去

测试:

使用get和post方法访问

curl http://127.0.0.1:8000/login/
  • 1
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/菜鸟追梦旅行/article/detail/80028
推荐阅读
相关标签
  

闽ICP备14008679号