第三章 Django 视图系统

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



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.GET GET请求所有参数,返回QueryDict类型
request.POST POST请求所有参数,返回QueryDict类型
request.COOKIES 以字典格式返回Cookie
request.session 可读写的类似于字典的对象,表示当前的会话
request.FILES 所有上传的文件
request.META 所有上传的文件

路由

# devops/urls.py
from django.urls import path
from myapp import views

urlpatterns = [
    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 views

urlpatterns = [
    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 views

urlpatterns = [
    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.GET
   print(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 views

urlpatterns = [
    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.GET
    for 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 views

urlpatterns = [
    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>" %key
    return 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 os
        file_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 = 700
    return 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 datetime
    now = 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 datetime
    now = 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 = 700
    return 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 views

urlpatterns = [
    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 views

urlpatterns = [
    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 views

urlpatterns = [
   re_path('api/$',views.api)
]

视图

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

验证

在这里插入图片描述

相关推荐

  1. django

    2023-12-16 15:38:04       64 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2023-12-16 15:38:04       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2023-12-16 15:38:04       100 阅读
  3. 在Django里面运行非项目文件

    2023-12-16 15:38:04       82 阅读
  4. Python语言-面向对象

    2023-12-16 15:38:04       91 阅读

热门阅读

  1. HAProxy 根据报文解析来定义不同的acl

    2023-12-16 15:38:04       50 阅读
  2. 【LeetCode】15. 三数之和(Set用法)

    2023-12-16 15:38:04       64 阅读
  3. C语言编程题-单身狗

    2023-12-16 15:38:04       54 阅读
  4. 小程序人脸识别—检测人脸图片获取图片

    2023-12-16 15:38:04       38 阅读
  5. 贪心算法总结

    2023-12-16 15:38:04       59 阅读
  6. SpringCloud 和 Linux 八股文第二期五问五答

    2023-12-16 15:38:04       67 阅读
  7. opencv 安装

    2023-12-16 15:38:04       42 阅读
  8. PHP获取数组中最大最小值和下标

    2023-12-16 15:38:04       48 阅读
  9. C语言——const函数

    2023-12-16 15:38:04       56 阅读
  10. centos网卡重命名方法

    2023-12-16 15:38:04       61 阅读
  11. 我为什么要当程序员?

    2023-12-16 15:38:04       68 阅读
  12. KafKa基本原理

    2023-12-16 15:38:04       54 阅读
  13. 叁[3],函数DispImage/DispObj

    2023-12-16 15:38:04       54 阅读