第三章 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对象

例如:

python 复制代码
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 所有上传的文件

路由

python 复制代码
# devops/urls.py
from django.urls import path
from myapp import views

urlpatterns = [
    path('index/',views.index),
]

视图

python 复制代码
# 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所有信息,报货主机名、路径和参数

路由

python 复制代码
# devops/urls.py
from django.urls import path
from myapp import views

urlpatterns = [
    path('index/',views.index),
]

视图

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

python 复制代码
http://49.232.221.200:8888/index/?id=123&value=100

路由

python 复制代码
# devops/urls.py
from django.urls import path
from myapp import views

urlpatterns = [
    path('index/',views.index),
]

视图

python 复制代码
# 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对象,类似于字典

python 复制代码
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() 返回字典

路由

python 复制代码
# devops/urls.py
from django.urls import path
from myapp import views

urlpatterns = [
    path('index/',views.index),
]

视图

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

路由

python 复制代码
# devops/urls.py
from django.urls import path,re_path
from myapp import views

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

视图

python 复制代码
# 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防跨站机制进行注释

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

路由

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

视图

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

网页

python 复制代码
# 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:上传文件头像图片

python 复制代码
mkdir -p /data/devops/upload

路由

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

视图

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

网页

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

给浏览器返回数据

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

示例

返回HTML内容

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

设置响应头

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

路由

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

视图

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

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

示例

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

路由

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

视图

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

网页

python 复制代码
# 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函数:重定向,发起第二次其你去

python 复制代码
语法: redirect(to,*args,**kwargs)

参数可以是:

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

示例

python 复制代码
from django.shortcuts import redirect
def test)redirect(request):
    return redirect('https://www.baidu.com')

路由

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

视图

python 复制代码
# 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函数:流式响应可迭代对象

路由

python 复制代码
# 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")
]

视图

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

网页

python 复制代码
# 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函数:如果提供文件下载建议方法

路由

python 复制代码
# 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")
]

视图

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

网页

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

示例

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

路由

python 复制代码
# devops/urls.py
from django.urls import path,re_path
from myapp import views

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

视图

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

验证

相关推荐
q567315233 分钟前
在 Bash 中获取 Python 模块变量列
开发语言·python·bash
是萝卜干呀3 分钟前
Backend - Python 爬取网页数据并保存在Excel文件中
python·excel·table·xlwt·爬取网页数据
代码欢乐豆4 分钟前
数据采集之selenium模拟登录
python·selenium·测试工具
狂奔solar39 分钟前
yelp数据集上识别潜在的热门商家
开发语言·python
Tassel_YUE40 分钟前
网络自动化04:python实现ACL匹配信息(主机与主机信息)
网络·python·自动化
聪明的墨菲特i1 小时前
Python爬虫学习
爬虫·python·学习
努力的家伙是不讨厌的2 小时前
解析json导出csv或者直接入库
开发语言·python·json
云空2 小时前
《Python 与 SQLite:强大的数据库组合》
数据库·python·sqlite
凤枭香3 小时前
Python OpenCV 傅里叶变换
开发语言·图像处理·python·opencv
测试杂货铺3 小时前
外包干了2年,快要废了。。
自动化测试·软件测试·python·功能测试·测试工具·面试·职场和发展