作者:BerenCamlost

目录

  • 作者:BerenCamlost
  • 1 前期准备
  • 2 概述
    • 2.1 作用
    • 2.2 本质
    • 2.3 响应
    • 2.4 过程
  • 3 URL配置
    • 3.1 配置流程
    • 3.2 引入其他url配置
    • 3.3 url反向解析
  • 4 视图函数
    • 4.1 定义视图
    • 4.2 错误视图
      • 4.2.1 404视图
      • 4.2.2 500视图
      • 4.2.3 400视图
  • 5 HttpRequest
    • 5.1 概述
    • 5.2 属性
    • 5.3 方法
    • 5.4 QueryDict对象
      • 方法
    • 5.5 GET属性
      • 5.5.1 作用
      • 5.5.2 get()
      • 5.5.3 getlist()
    • 5.6 POST
      • 5.6.1 属性
      • 5.6.2 HTML文件
        • 1 sunck/POST/show_register.html
        • 2 sunck/POST/register.html
      • 5.6.3 views.py视图文件
      • 5.6.4 urls.py路径
      • 5.6.5 修改settings.py文件
  • 6 HTTP Response对象
    • 6.1 概述
    • 6.2 返回数据用法
      • 6.2.1 不用模板,直接返回数据
      • 6.2.2 调用模板,使用render方法
    • 6.3 属性
    • 6.4 方法
    • 6.5 子类:HttpResponseRedirect
      • 6.5.1 功能
      • 6.5.2 示例
      • 6.5.3 简写
    • 6.6 子类:JsonResponse
  • 7 状态保持
    • 7.1 概述
    • 7.2 启用session
    • 7.3 使用session
    • 7.4 设置过期时间
  • 下一章:Python—Django中的模板(template)

1 前期准备

  1. 启动mysql服务,新建一个数据库
  2. 生成迁移文件
> python manage.py makemigrations
> python manage.py migrate
  1. 启动服务
> python manage.py runserver

2 概述

2.1 作用

  • 视图接受Web请求,并响应Web请求。
  • url只是找到一个视图,真正响应的是视图中的函数。

2.2 本质

视图就是一个Python中的函数

2.3 响应

  1. 网页

    • 重定向
    • 错误视图(404,500,400)详见4.2节
  2. JSON数据

2.4 过程

3 URL配置

3.1 配置流程

  1. 指定根级url的配置文件

    • 在settings.py文件下的ROOT_URLCONF = 'test1.urls'语句中配置
    • 默认实现了
  2. urlpatterns:这是一个url的实例列表,url对象
    • 正则表达式
    • 视图名称
    • 名称(url反向解析)
from django.contrib import admin
from django.urls import path, include
urlpatterns = [path('admin/', admin.site.urls),# url(r'^', include('sunck.urls')),  # ^表示什么都不输入,就是主页,加r表示不转义# 然后就跳转到sunck.urls.py这个文件中,再在sunck.urls.py文件中配置视图path('', include('sunck.urls', namespace='sunck'))
]from django.conf.urls import url
from django.urls import path
from . import views  # 引入当前目录下的views
app_name = "sunck"
# 命名app名称,给projests/urls.py中的path('', include('sunck.urls', namespace='sunck'))
# 中的namespace设置可以搜索到的名字
urlpatterns = [url(r'^$', views.index),path('<int:num>/<int:num2>/', views.detail, name='detail'),# def detail(request, num, num2):#        return HttpResponse("detail-%d-%d" % (num, num2))path('students/', views.students, name='students'),path('grades/<int:num>', views.grades_students, name='gradesStudents'),
]
  1. url配置的注意事项

    • 如果想从url中获取一个值,需要加<>
    • 前边不需要加反斜杠“/”
    • 前边加r表示不转义

3.2 引入其他url配置

  • 在应用中创建urls.py文件,定义本应用的url配置,在工程urls.py中使用include()方法,如上边的代码所示

3.3 url反向解析

  • 【概述】:如果在视图,模板(html)中使用了硬编码链接,在url配置发生改变时,动态生成链接的地址。
  • 【解决思路】:在使用链接时,通过url配置的名称(name),动态生成url地址
  • 【作用】:使用url模板,这个在下一章中会提到

4 视图函数

4.1 定义视图

  1. 【本质】:一个函数
  2. 【视图参数】:
    • 一个HttpRequest实例,浏览器发过来的请求对象
    • 通过正则表达式获取的参数
  3. 位置:一般在views.py中定义

4.2 错误视图

4.2.1 404视图

  • 【概述】:找不到网页(url匹配不成功)时返回
  1. 在templates目录下定义404.html
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>404NOT Found</title>
</head>
<body><h1>您请求的页面跑丢了</h1><h2>您请求的页面是:{{ request_path }}</h2><!--request_path是请求的连接--></body>
</html>
  1. 配置setings.py文件
DEBUG = FalseALLOWED_HOSTS = ['*']
  • 【注意】这里将DEBUG = False配置后,Django的admin界面的CSS和js文件等都会出现找不到的情况,如果出现类似情况只需要把这个改回来就可以了,但是404页面也就变成了原来的Django样式。

4.2.2 500视图

  • 在视图代码中出现错误(服务器代码错误)

4.2.3 400视图

  • 错误出现在客户的操作

5 HttpRequest

5.1 概述

  1. 服务器接收Http请求后,会根据报文创建HTTP Request对象
  2. 视图的第一个参数是HTTP Request对象
  3. Django创建的,视图调用时传递给视图

5.2 属性

path:        请求的完整路径(不包括域名和端口)
method:     表示请求的方式,常用的有GET,POST
encoding:   表示浏览器提交的数据的编码方式,一般为utf-8
GET:     类似于字典的对象,包含了get请求的所有参数
POST:       类似于字典的对象,包含了post请求的所有参数
FILES:      类似字典的对象,包含了所有上传的文件
COOKIES:    字典,包含所有的cookie
session:    类似字典的对象,表示当前会话
  • 利用网页显示这些信息:
# urls.py
path('request/', views.requests, name='request'),# views.py
def requests(request):request_list = {'request.path': request.path,'request.method': request.method,'request.encoding': request.encoding,'request.GET': request.GET,'request.POST': request.POST,'request.FILES': request.FILES,'request.COOKIES': request.COOKIES,'request.session': request.session,'request.is_ajax()': request.is_ajax(),}return render(request, 'sunck/request.html', {'request_list': request_list})
<!--sunck/request.html-->
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>HTTPrequest属性和方法测试</title>
</head>
<body><h1>HTTPrequest属性和方法测试</h1><ul>{% for key, value in request_list.items %}<li>{{ key }}:{{ value }}</li>{% endfor %}</ul></body>
</html>

5.3 方法

is_ajax():   如果是通过XMLHttpRequest发起的,返回 True

5.4 QueryDict对象

  • request对象中的GET,POST都属于QueryDict对象

方法

  1. get():
    根据键获取值,只能获取一个值
    www.sunck.wang/abc?a=1&b=2&c=3
  2. getlist()
    将键的值以列表的形式返回
    可以获取多个值
    www.sunck.wang/abc?a=1&a=2&c=3

5.5 GET属性

5.5.1 作用

获取浏览器传递给服务器的数据

5.5.2 get()

每个键只能对应一个数据
http://127.0.0.1:8000/sunck/GET/?a=1&b=2&c=3

# 获取get传递的数据
def gets(request):get_list = {'a': request.GET.get('a'),'b': request.GET['b'],  # 也可以用这种方式'c': request.GET.get('c'),}return render(request, 'sunck/GET.html', {'get_list': get_list})

HTML文件:“sunck/GET.html”

{#sunck/request.html#}
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>GET属性和方法测试</title>
</head>
<body><h1>GET属性和方法测试</h1><ul>{% for key, value in get_list.items %}<li>{{ key }}:{{ value }}</li>{% endfor %}</ul>
</body>
</html>

5.5.3 getlist()

每个键可以对应多个数据,对应一个数据列表
http://127.0.0.1:8000/sunck/GET/?a=1&a=2&c=3

ef gets(request):get_list = {'list': request.GET.getlist('a'),'c': request.GET.get('c'),}return render(request, 'sunck/GET.html', {'get_list': get_list})

对应的HTML文件和上边的一样

5.6 POST

5.6.1 属性

利用表单模拟POST请求。
下面简单介绍使用一个注册的页面,传递数据给另外一个界面。

5.6.2 HTML文件

1 sunck/POST/show_register.html

这个页面是用户看到的注册页面

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>注册</title>
</head>
<body>
<form action="../register/" method="post">
<!--这里的action需要和后面的urls路径相对应-->姓名:<input type="text" name="name" value=""/><hr>性别:<input type="radio" name="gender" value="1">男<input type="radio" name="gender" value="0">女<hr>年龄:<input type="text" name="age" value=""/><hr>爱好:<input type="checkbox" name="hobby" value="power"/>权利<input type="checkbox" name="hobby" value="money">金钱<input type="checkbox" name="hobby" value="beauty">美女<input type="checkbox" name="hobby" value="Tesla">Tesla<hr><input type="submit" value="注册">
</form>
</body>
</html>

界面效果如下图所示:

2 sunck/POST/register.html

这个页面是为了将用户注册的数据显示出来,其原理和register、get测试时的原理相同。

{#sunck/request.html#}
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>POST属性和方法测试</title>
</head>
<body><h1>POST属性和方法测试</h1><ul>{% for key, value in register_list.items %}<li>{{ key }}:{{ value }}</li>{% endfor %}</ul>
</body>
</html>

5.6.3 views.py视图文件

# POST测试
def show_register(request):return render(request, 'sunck/POST/show_register.html', )def register(request):register_list = {'name': request.POST.get('name'),  # 这里的get和getlist可能没有代码提示'gender': request.POST.get('gender'),'age': request.POST.get('age'),'hobby': request.POST.getlist('hobby'),}return render(request, 'sunck/POST/register.html', {'register_list': register_list}, )

5.6.4 urls.py路径

    path('POST/showRegister/', views.show_register, ),path('POST/register/', views.register, ),

5.6.5 修改settings.py文件

注释掉那一行
因为Django有自动预防跨站攻击

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',
]

6 HTTP Response对象

6.1 概述

  • 【作用】:给浏览器返回数据
  • 【对比】:HttpRequest对象是由Django创建的,HttpResponse对象是由程序员创建

6.2 返回数据用法

6.2.1 不用模板,直接返回数据

def index(request):return HttpResponse('sunck is a good man')

6.2.2 调用模板,使用render方法

  1. 原型
def render(request, template_name, context=None,
content_type=None, status=None, using=None):
# request:请求体 对象
# template_name:模板路径
# context:传递给需要渲染在模板上的数据
  1. 作用:
    结合数据和模板,返回一个完整的HTML页面
  2. 示例:
def grades_students(request, num):# 获得对应的班级对象grade = Grades.graObj2.get(pk=num)# 获得班级下的所有学生列表students_list = Students.stuObj2.filter(sgrade_id__exact=num)return render(request, 'sunck/students.html', {"students": students_list,"grade": grade.gname,})

6.3 属性

  1. content:表示返回内容
  2. charset:返回数据的编码格式
  3. status_code:响应状态码
    200,304,404
  4. content-type:指定输出的MIME类型
# response
def response(request):response1 = HttpResponse()response_list = {'response.content': response1.content,'response.charset': response1.charset,'response.status_code': response1.status_code,}return render(request, 'sunck/response.html', {'response_list': response_list})

6.4 方法

  1. init:使用页面内容实例化HttpResponse对象
  2. write(content):以文件的形式写入
  3. flush():以文件的形式输出缓冲区
  4. set_cookie(key, value, maxAge=None, exprise=None)
    设置一条cookie
  5. delete_cookie(key):
    • 删除cookie
    • 如果删除一个不存在的cookie,就当什么都没发生

6.5 子类:HttpResponseRedirect

6.5.1 功能

重定向,服务器端的跳转

6.5.2 示例

# 重定向
from django.http import HttpResponseRedirectdef redirect1(request):# 可以使用如下两种方式# return HttpResponseRedirect('/sunck/redirect2/')return HttpResponseRedirect('../redirect2/')def redirect2(request):return HttpResponse('我是重定向后的视图')

6.5.3 简写

使用redirect(to)这个方法,在django.shortcuts中包含

# 重定向
from django.shortcuts import redirectdef redirect1(request):# 简写return redirect('/sunck/redirect2')def redirect2(request):return HttpResponse('我是重定向后的视图')

to推荐使用反向解析

6.6 子类:JsonResponse

  1. 返回Json数据,一般用于异步请求
  2. __init__(self.data)
  3. data:一个字典对象
  4. 注意:Content-type类型为application/json

7 状态保持

7.1 概述

  • http协议是无状态的,每次请求都是一次新的请求,它不记得之前的请求。
  • 客户端与服务器的一次通信就是一次会话
  • 实现状态的保持,在客户端或服务端存储有关会话的数据
  • 存储的方式
    • cookie:所有数据存储在客户端,不要存储敏感的数据
    • 【推荐】session:所有的数据存储在服务端,在客户端用cookie存储session_id
  • 状态保持的目的:
    在一段时间内跟踪请求者的状态,可以实现跨页面访问当前的请求者的数据
  • 注意:不同的请求者之间不会共享这个数据,与请求者一一对应

7.2 启用session

在settings.py中找到


默认情况下,Django是启用session的。

7.3 使用session

  1. 启用session后,每个httpRequest对象都有一个session属性,就是一个类似字典的对象
  2. get(key, default=None) 根据键获取session值
  3. clear()
    清空所有会话
  4. flush()
    删除当前会话并删除会话的cookie
# session
from django.contrib.auth import logout
def welcome(request):username = request.POST.get('username')# 储存sessionrequest.session['username'] = username# 取sessionusername = request.session.get('username', '游客')# 清除session# logout(request)# request.session.clear()# request.session.flush()return render(request, 'sunck/session/welcome.html', {'username': username})def log(request):return render(request, 'sunck/session/log.html', )

对应的HTML文件为

  • welcome.html:
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>我的</title>
</head>
<body><h1>欢迎:{{ username }}</h1><a href="/sunck/session/log/">登录</a>
</body>
</html>
  • log.html:
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>登录</title>
</head>
<body><form action="/sunck/session/welcome/" method="post"><input type="text" name="username"/><input type="submit" value="登录"/></form>
</body>
</html>

7.4 设置过期时间

  • 使用set_expiry(value)设置过期时间
    request.session.set_expiry(10) 设置为10秒后过期
  • 如果不设置,2个星期后过期
  • 时间对象
  • value设置为0代表关闭浏览器时过期
  • value设置为None代表设置永不过期,不推荐

下一章:Python—Django中的模板(template)

Python—Django中的视图(views.py)相关推荐

  1. 如何在Python Django中处理用户身份验证

    by Mohammed Subhan Khan 由Mohammed Subhan Khan 如何在Python Django中处理用户身份验证 (How to handle user authenti ...

  2. Django中的视图(view)

    视图 1.什么是视图 视图就是Django项目下的view.py文件,它的内部是一系列的函数或者是类,用来专门处理客户端访问请求后处理请求并且返回相应的数据,相当于一个中央情报处理系统 2.具体视图实 ...

  3. python Django Rest_Framework框架 视图集与路由Routers详解(图文并茂版)

    视图集与路由Routers详解 视图集 ViewSet视图集 代码实现 GenericViewSet视图集 代码实现 ModelViewSet视图集 ReadOnlyModelViewSet视图集 路 ...

  4. Python代码中执行另外一个.py文件

    关于Python 脚本如何执行另一个脚本,可以使用os.system()来实现 https://blog.csdn.net/shenjin_s/article/details/79976954 简单粗 ...

  5. 学生公寓管理系统-python+Django+Mysql(附视图代码)

    一.系统开发平台............................................................................................ ...

  6. 在python程序中调用另一个py文件

    在同一个文件夹下 调用函数: A.py文件: def add(x,y): print('和为:%d'%(x+y)) B.py文件: import A A.add(1,2) 或 from A impor ...

  7. Python Django 基于通用视图实现图片的显示功能代码示例

  8. Python Django中,页面改变但链接地址没有跳转,解决方法

    预期是发送密码重置邮件后自动跳转到首页, 这个效果实现了,但是地址链接没有变,经过仔细定位, 解决方案如下: return render(request, 'login.html',{'msg': ' ...

  9. python的目的及应用_python Django中的apps.py的目的是什么_python_脚本之家

    This question has been asked earlier: 07000 Application configuration objects store metadata for an ...

  10. python框架django教程_[Python] Django框架入门3——深入视图

    说明: 本文主要深入了解视图(views.py),涉及路由配置.定义视图.Request对象.Response对象.状态保持等. 一.路由配置 1.配置位置(settings.py 的 ROOT_UR ...

最新文章

  1. Mongodb的索引操作
  2. 计算机具有很强的记忆力记忆能力的基础是,基于学习能力的记忆力计算机测评研究...
  3. 【C++】写一个类重载加减乘除取余运算符
  4. Qt ObjectModel (from Qt doc)
  5. python 随机获取列表的元素_练习 34 - 获取列表元素 - Learn Python 3 The Hard Way
  6. 我历时3年才写了10余篇源码文章,但收获了100w+阅读
  7. 设置公共请求参数_基于分布式锁的防止重复请求解决方案(值得收藏)
  8. Hat’s Words(HDU-1247)
  9. 焦虑症患者,整天心神不宁,忧心忡忡怎么办?
  10. 动态路由协议的基本配置---RIP
  11. cas 怎么过滤带pathvariable_过滤材料怎么摆?记住这个“公式”就好~
  12. AutoJs学习-几个QQ群脚本(群引流\提取成员\加群友\加群)
  13. STM32F427V系列的触摸屏驱动
  14. 线索二叉树的建立和遍历
  15. python静态网络爬虫
  16. 计算机术语中ict表示是什么意思,ICT是什么工作
  17. 十大简单排序:桶排序
  18. 基于jsp的实验室预约管理系统的设计与实现
  19. 软件测试配置管理的概念
  20. js求(1~n)之间 素数之和

热门文章

  1. ZOJ ACM忽悠训练
  2. 如何将英文PDF翻译成中文且格式不变?(PDF免费翻译攻略)
  3. python绘制正态分布图_在python中画正态分布图像的实例
  4. 面经——嵌入式常见面试题总结100题(下)
  5. 计算机第一个应用领域是,第一代计算机主要应用领域是什么
  6. 【AutoCAD】04.直线类命令
  7. 锯齿波FMCW测距、测速的原理
  8. R语言|plot和par函数绘图详解,绘图区域设置 颜色设置 绘图后修改及图像输出
  9. win10计算机管理员的权限才能删除,Win10文件夹删除不了需要管理员权限怎么办?Win10文件夹删除不了需要管理员权限的解决方法...
  10. activiti 获取审批人员_activiti,根据任务id获取该任务节点配置的获选人或者获选组...