ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

第三章 Django 视图系统

2026/8/5 5:41:07 拓冰建站 浏览量
第三章 Django 视图系统

第一章 Django 基本使用
第二章 Django URL路由系统
第三章 Django 视图系统
第四章 Django 模板系统
第五章 Django 数据模型系统(基本使用)
第六章 Django 数据模型系统(多表操作)
第七章 Django 用户认证与会话技术
第八章 Django CSRF防护


文章目录

  • Django内建函数与HTTP请求流程
    • Django内建函数
    • HTTP请求流程
    • Django请求流程
  • HttpResponse常用属性和方法
    • 常用属性
      • 路由
      • 视图
      • 验证
    • 常用方法
      • 路由
      • 视图
      • 验证
    • 处理URL参数
      • 路由
      • 视图
      • 验证
  • HttpRequest对象:QueryDic对象
    • QueryDic对象介绍
      • 视图
      • 验证
    • 示例1:搜索
      • 路由
      • 视图
      • 验证
    • 示例2:登录页面
      • 路由
      • 视图
      • 网页
      • 验证
    • 示例3:上传文件头像图片
      • 路由
      • 视图
      • 网页
      • 验证
  • 函数
    • HttpResponse函数
      • 示例
      • 路由
      • 视图
      • 验证
    • render函数
      • 路由
      • 视图
      • 网页
      • 验证
    • redrict函数
      • 路由
      • 视图
      • 验证
  • 流处理函数,实现图片下载
    • StreamingHttpResponse函数
    • 路由
      • 视图
      • 网页
      • 验证
    • FileResponse函数
      • 路由
      • 视图
      • 网页
      • 验证
    • JsonResponse函数
      • 路由
      • 视图
      • 验证


Django内建函数与HTTP请求流程

Django内建函数

Django内置函数
http
HttpResponse
StreamingHttpResponse
响应可迭代对象
FileResponse
下载文件
jsonResponse
返回JSON
shortcuts
render
响应HttpResponse对象,一个快捷函数
redirect
跳转函数
views
generic
View
类视图继承的类
decorators
csrf
csrf_exempt,csrf_protect
取消某视图CSRF防护
contrib
admin
内建管理后台
auth
login
登录
logout
退出
authenticate
用户信息认证
decorators
login_required
登录认证装饰器
models
User
获取登录用户信息
BaseUserManager,AbstractBaseUser
扩展auth_user表字段
conf
setting
导入配置文件
db
connection
连接数据库

HTTP请求流程

在这里插入图片描述

  • 建立TCP连接:三次握手
  • 发送HTTP请求:进行分装了浏览器信息(方法\URL\浏览器信息等)
  • 相应HTTP请求:浏览器进行解析,获取信息
  • 关闭TCP连接

Django请求流程

在这里插入图片描述

  • pc发起请求
  • django根据路由转发到不通视图,转发时候会包含浏览器信息(request)
  • 视图会httpResponse发给django
  • django响应给pc

HttpResponse常用属性和方法

常用属性

Django会建立一个包含请求源数据的HttpResquest对象,当Django加载对应的视图时,HttpRequest对象将作为函数视图的第一个参数(request),每个视图负责返回一个HttpResponse对象

例如:

def index(request):return HttpResponse("首页")
属性描述
request.scheme表示请求协议的字符串(http或https)
request.body原始HTTP请求正文
request.path一个字符串,请求页面的完整路径,不包含域名
request.method一个字符串,请求的HTTP方法,比如GET/POST等
request.GETGET请求所有参数,返回QueryDict类型
request.POSTPOST请求所有参数,返回QueryDict类型
request.COOKIES以字典格式返回Cookie
request.session可读写的类似于字典的对象,表示当前的会话
request.FILES所有上传的文件
request.META所有上传的文件

路由

# devops/urls.py
from django.urls import path
from myapp import viewsurlpatterns = [path('index/',views.index),
]

视图

# myapp/views.py
from django.shortcuts import render,HttpResponse
def index(request):print('scheme:',request.scheme)print('body',request.body)print('path:',request.path)print('method:',request.method)print('GET:',request.GET)print('POST:',request.POST)print('COOKIES:',request.COOKIES)print('session:',request.session)print('FILES:',request.FILES)# print(request.META)print(request.META['TERM_PROGRAM'])return HttpResponse("<h1>首页</h1>")

验证

在这里插入图片描述

http://49.232.221.200:8888/index/?id=123

GET:<QueryDict: {‘id’: [‘123’]}> 会有一个参数传进来

常用方法

属性描述
request.get_host()服务器主机地址和端口
request.get_port()服务器端口
request.get_full_path()请求页面后缀
request.get_raw_uri()请求页面URL所有信息,报货主机名、路径和参数

路由

# devops/urls.py
from django.urls import path
from myapp import viewsurlpatterns = [path('index/',views.index),
]

视图

# myapp/views.py
from django.shortcuts import render,HttpResponse
def index(request):print(request.get_host())print(request.get_port())print(request.get_full_path())# print(request.get_raw_uri())return HttpResponse("<h1>首页</h1>")

验证

在这里插入图片描述

处理URL参数

http://49.232.221.200:8888/index/?id=123&value=100

路由

# devops/urls.py
from django.urls import path
from myapp import viewsurlpatterns = [path('index/',views.index),
]

视图

# myapp/views.py
from django.shortcuts import render,HttpResponse
def index(request):A = request.GET['id']B = request.GET['value']print(A)print(B)return HttpResponse("<h1>首页</h1>")

验证

在这里插入图片描述

HttpRequest对象:QueryDic对象

QueryDic对象介绍

reuqest.GET和request.POST返回的都是一个QueryDict对象,类似于字典

def index(request):req = request.GETprint(type(req))return HttpResponse("首页")
属性描述
req.get(key,default)返回key的值,如果key不存在返回default
req.items()返回迭代器,键值
req.values()返回迭代器,所有键的值
req.keys()返回所有键
req.getlist(key,deafult)返回key的值作为列表,如果key不存在返回default
req.lists()返回迭代器,所有键的值作为列表
req.dict()返回字典
### 路由
# devops/urls.py
from django.urls import path
from myapp import viewsurlpatterns = [path('index/',views.index),
]

视图

def index(request):A = request.GET['id']B = request.GET['value']# value = request.GET.get('value',None)# print(value)req = request.GETfor i in req.items():print(i)# print(A)# print(B)return HttpResponse("<h1>首页</h1>")

验证

http://49.232.221.200:8888/index/?id=123&value=100
在这里插入图片描述

示例1:搜索

路由

# devops/urls.py
from django.urls import path,re_path
from myapp import viewsurlpatterns = [re_path('^search/$',views.search),
]

视图

# myapp/views.py
def search(request):# key = request.GET.get('key')key = request.GET.get('key',None)if key is None:result = "<h1>请输入想要查询的</h1>"else:result = "<h1>你是想要查询 %s 是不是</h1>" %keyreturn HttpResponse(result)

验证

在这里插入图片描述
在这里插入图片描述

示例2:登录页面

先关闭django防跨站机制进行注释

devops/devops/settings.py
MIDDLEWARE = ['django.middleware.security.SecurityMiddleware','django.contrib.sessions.middleware.SessionMiddleware','django.middleware.common.CommonMiddleware',# 'django.middleware.csrf.CsrfViewMiddleware','django.contrib.auth.middleware.AuthenticationMiddleware','django.contrib.messages.middleware.MessageMiddleware','django.middleware.clickjacking.XFrameOptionsMiddleware',
]

路由

# devops/urls.py
from django.urls import path,re_path
from myapp import views
urlpatterns = [re_path('login/$',views.login,name="login"),path('index/',views.index),
]

视图

# myapp/views.py
from django.shortcuts import render,HttpResponse,redirect
# Create your views here.
def login(request):if request.method == "GET":return render(request,"login.html")elif request.method == "POST":# 获取用户通过post提交的用户名和密码username = request.POST.get('username',None)password = request.POST.get('password',None)if username == "wang" and password == "123456":# 登录成功# return HttpResponse("登录成功")return redirect("/index")else:# 登录失败msg = "用户名或密码输入错误!!!"return render(request,"login.html",{"msg":msg})# return render(request,"login.html")
def index(request):return HttpResponse("<h1>首页</h1>")

网页

# templates/login.html
<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8"><title>登录</title></head><body><form action="{% url "login" %}" method="post">用户名: <input type="text" name="username">密码: <input type="text" name="password"><button type="submit">登录</button></form><span style="color: red">{{ msg }}</span></body>
</html>

验证

http://49.232.221.200:8888/login/
错误示范:
在这里插入图片描述
在这里插入图片描述
正确示范:
在这里插入图片描述
在这里插入图片描述

示例3:上传文件头像图片

mkdir -p /data/devops/upload

路由

# devops/urls.py
from django.urls import path,re_path
from myapp import views
urlpatterns = [re_path('user/$',views.user,name="user"),
]

视图

# myapp/views.py
from django.shortcuts import render,HttpResponse,redirect
# Create your views here.
def user(request):if request.method == "GET":return render(request,'user.html')elif request.method == "POST":obj = request.FILES.get('touxiang')import osfile_path = os.path.join('upload',obj.name)with open(file_path,mode="wb") as f:for i in obj.chunks():f.write(i)msg = "上传文件成功"return render(request,"user.html",{"msg":msg})

网页

# templates/user.html
<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8"><title>用户信息</title></head><body><form action="{% url "user" %}" method="post", enctype="multipart/form-data"><input type="file" name="touxiang"><button type="submit">提交头像</button></form><span style="color: red">{{ msg }}</span></body>
</html>

验证

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

函数

HttpResponse函数

给浏览器返回数据

语法:HTTPResponse(content=响应体,content_type=相应体数据类型,status=状态码)

示例

返回HTML内容

from django.http import HtttpResponse
def hello(request):return HttpResponse("<h1>Hello Django!</h1>")

设置响应头

from django.http import HttpResponse
def hello(request):res = HttpResponse("Hello APP!")res['name'] = "aliang"res.status_code = 302

路由

# devops/devops/urls.py
from django.urls import path,re_path
from myapp import views
urlpatterns = [re_path('index/$',views.index),
]

视图

# devops/devops/views.py
from django.shortcuts import render,HttpResponse,redirect
def index(request):res = HttpResponse("<h1>首页</h1>")res['username'] = "wq"res.status_code = 700return res

验证

URL:http://49.232.221.200:8888/index/

在这里插入图片描述

render函数

render指定模板,返回一个渲染后的HttpResponse对象

语法: render(request,template_name,context=None,content_type=None,status=None,using=None)
  • request:固定参数,django封装的要求
  • template_name:返回html模板
  • context:传入模板中的内容,用于渲染模板,默认空字典

示例

from django.shortcuts import render
from datetime import datetime
def current_datetime(request):now = datetime.now()return render(request,'demo.html',{'datetime':now})

路由

# devops/devops/urls.py
from django.urls import path,re_path
from myapp import views
urlpatterns = [re_path('date/$',views.date),
]

视图

# devops/devops/views.py
from django.shortcuts import render,HttpResponse,redirect
# Create your views here.
def date(request):from datetime import datetimenow = datetime.now()return render(request,'date.html',{'now':now})

网页

# devops/templates/date.html
<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8"><title>显示当前时间</title></head><body>{{ now }}</body>
</html>

验证

URL:http://49.232.221.200:8888/date/

在这里插入图片描述

redrict函数

redrict函数:重定向,发起第二次其你去

语法: redirect(to,*args,**kwargs)

参数可以是:

  • 一个视图
  • 一个绝对的或者相对的URL
  • 一个模型,对象是重定向的URL

示例

from django.shortcuts import redirect
def test)redirect(request):return redirect('https://www.baidu.com')

路由

# devops/devops/urls.py
from django.urls import path,re_path
from myapp import views
urlpatterns = [re_path('date/$',views.date),
]

视图

# devops/devops/views.py
from django.shortcuts import render,HttpResponse,redirect
# Create your views here.
def date(request):from datetime import datetimenow = datetime.now()# return render(request,'date.html',{'now':now})# return redirect('http://www.baidu.com')return redirect('/index')
def index(request):res = HttpResponse("<h1>首页</h1>")res['username'] = "wq"res.status_code = 700return res

验证

访问:http://49.232.221.200:8888/date
会跳到:http://49.232.221.200:8888/index/

流处理函数,实现图片下载

StreamingHttpResponse函数

StreamingHttpResponse函数:流式响应可迭代对象

路由

# devops/urls.py
from django.urls import path,re_path
from myapp import viewsurlpatterns = [re_path('upload_list/$',views.upload_list),re_path('download/(?P<filename>.*)$',views.download,name="download")
]

视图

# myapp/views.py
from django.shortcuts import render,HttpResponse,redirect
import os
from django.http import StreamingHttpResponse
# Create your views here.
def upload_list(request):file_list=os.listdir('upload')return render(request,"upload_list.html",{'file_list':file_list})def download(request,filename):file_path=os.path.join('upload',filename) # 使用os拼接可以有效的防止windwos反斜杠路径res=StreamingHttpResponse(open(file_path,'rb'))# 因为没有定义头部信息,浏览器读取出来是乱码,所以定义下# 传输流res['Content-Type']='application/octet-stream'# 加描述res['Content-Disposition']='attachment: filename=%s' %(os.path.basename(file_path))return res

网页

# templates/upload_list.html
<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8"><title>文件列表</title></head><body>{% for i in file_list %}<a href="{% url 'download' i %}">{{ i }}</a><br>{% endfor %}</body>
</html>

验证

在这里插入图片描述

FileResponse函数

FileResponse函数:如果提供文件下载建议方法

路由

# devops/urls.py
from django.urls import path,re_path
from myapp import viewsurlpatterns = [re_path('upload_list/$',views.upload_list),re_path('download/(?P<filename>.*)$',views.download,name="download")
]

视图

# myapp/views.py
from django.shortcuts import render,HttpResponse,redirect
import os
from django.http import StreamingHttpResponse,FileResponse
# Create your views here.
def upload_list(request):file_list=os.listdir('upload')return render(request,"upload_list.html",{'file_list':file_list})def download(request,filename):file_path=os.path.join('upload',filename) # 使用os拼接可以有效的防止windwos反斜杠路径res=FileResponse(open(file_path,'rb'))# 因为没有定义头部信息,浏览器读取出来是乱码,所以定义下# 传输流res['Content-Type']='application/octet-stream'# 加描述res['Content-Disposition']='attachment: filename=%s' %(os.path.basename(file_path))return res

网页

# templates/upload_list.html
<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8"><title>文件列表</title></head><body>{% for i in file_list %}<a href="{% url 'download' i %}">{{ i }}</a><br>{% endfor %}</body>
</html>

验证

在这里插入图片描述

JsonResponse函数

响应一个JSON对象

示例

from django.http import JsonResponse
def test_response(request):res={ 'foo' : 'bar' }return JsonResponse(res)

路由

# devops/urls.py
from django.urls import path,re_path
from myapp import viewsurlpatterns = [re_path('api/$',views.api)
]

视图

# myapp/views.py
from django.http import JsonResponse
def api(request):res={ 'foo':'bar','age':'30'}return JsonResponse(res)

验证

在这里插入图片描述