Django - - - -视图层之视图函数(views)
阅读目录(Content)
- 视图层之视图函数(views)
- 一个简单的视图
- 1.HttpRequest
- 2.HttpResponse
- 1.render 函数
- 2.redirect 函数
- 对比render与redirect:
回到顶部(go to top)
视图层之视图函数(views)
一个视图函数,简称视图,是一个简单的Python 函数,它接受Web请求并且返回Web响应。响应可以是一张网页的HTML内容,一个重定向,一个404错误,一个XML文档,或者一张图片. . . 是任何东西都可以。无论视图本身包含什么逻辑,都要返回响应。代码写在哪里也无所谓,只要它在你的Python目录下面。除此之外没有更多的要求了——可以说“没有什么神奇的地方”。为了将代码放在某处,约定是将视图放置在项目或应用程序目录中的名为views.py的文件中。
视图函数:
一定包含两个对象:
requset---->用户请求相关的所有信息(对象)
Httpresponse---->响应字符串
一个简单的视图
下面是一个返回当前日期和时间作为HTML文档的视图:
from django.http import HttpResponse import datetimedef current_datetime(request):now = datetime.datetime.now()html = "<html><body>It is now %s.</body></html>" % nowreturn HttpResponse(html)
让我们逐行阅读上面的代码:
首先,我们从 django.http模块导入了HttpResponse类,以及Python的datetime库。
接着,我们定义了current_datetime函数。它就是视图函数。每个视图函数都使用HttpRequest对象作为第一个参数,并且通常称之为request。
注意,视图函数的名称并不重要;不需要用一个统一的命名方式来命名,以便让Django识别它。我们将其命名为current_datetime,是因为这个名称能够精确地反映出它的功能。
这个视图会返回一个HttpResponse对象,其中包含生成的响应。每个视图函数都负责返回一个HttpResponse对象。
视图函数,围绕着两个对象进行:HttpResponse和HttpRequest
1.HttpRequest
request---->请求信息
属性:
request.path # 获取访问文件路径request.method属性 #获取请求中使用的HTTP方式(POST/GET)request.body #含所有请求体信息 是bytes类型request.GET #GET请求的数据(类字典对象) 请求头中的url中?后面拿值
request.POST # POST请求的数据(类字典对象) 请求体里拿值request.COOKIES #包含所有cookies的标准Python字典对象;keys和values都是字符串。
request.FILES: 包含所有上传文件的类字典对象;FILES中的每一个Key都是<input type="file" name="" />标签中name属性的值,FILES中的每一个value同时也是一个标准的python字典对象,包含下面三个Keys:filename: 上传文件名,用字符串表示content_type: 上传文件的Content Typecontent: 上传文件的原始内容request.user: 是一个django.contrib.auth.models.User对象,代表当前登陆的用户。如果访问用户当前没有登陆,user将被初始化为django.contrib.auth.models.AnonymousUser的实例。你可以通过user的is_authenticated()方法来辨别用户是否登陆:if req.user.is_authenticated();只有激活Django中的AuthenticationMiddleware时该属性才可用request.session: 唯一可读写的属性,代表当前会话的字典对象;自己有激活Django中的session支持时该属性才可用request.GET.get('name') 拿到GET请求里name的值如果某个键对应有多个值,则不能直接用get取值,需要用getlist,如:request.POST.getlist("hobby")
请求url:http://127.0.0.1:8000/index.html/23?a=1request.path : 请求路径 request.path结果为:/index.html/23request.get_full_path()request.get_full_path()结果为:/index.html/23?a=1
方法:
1 |
|
注意:键值对的值是多个的时候,比如checkbox类型的input标签,select标签,需要用:
1 |
|
2.HttpResponse
HttpResponse---->相应字符串
对于HttpRequest请求对象来说,是由django自动创建的,但是,HttpResponse响应对象就必须我们自己创建。每个view请求处理方法必须返回一个HttpResponse响应对象。HttpResponse类在django.http.HttpResponse。
在HttpResponse对象上扩展的常用方法
1.render 函数
将指定页面渲染后返回给浏览器
render(request, template_name[, context])
结合一个给定的模板和一个给定的上下文字典,并返回一个渲染后的 HttpResponse 对象。
参数:request: 用于生成响应的请求对象。template_name:要使用的模板的完整名称,可选的参数context:添加到模板上下文的一个字典。默认是一个空字典。如果字典中的某个值是可调用的,视图将在渲染模板之前调用它。content_type:生成的文档要使用的MIME类型。默认为DEFAULT_CONTENT_TYPE 设置的值。status:响应的状态码。默认为200。
from django.shortcuts import renderdef test(request):return render(request,'index.html') #向用户显示一个html页面
下面为render官方源码,可以看出render最后也是返回了一个HttpResponse给webserver
def render(request, template_name, context=None, content_type=None, status=None, using=None):"""Returns a HttpResponse whose content is filled with the result of callingdjango.template.loader.render_to_string() with the passed arguments."""content = loader.render_to_string(template_name, context, request, using=using)return HttpResponse(content, content_type, status)
细说render:
render方法主要是将从服务器提取的数据,填充到模板中,然后将渲染后的html静态文件返回给浏览器。这里一定要注意:render渲染的是模板,下面我们看看什么叫作模板:
<!DOCTYPE html> <html lang="en"> <head><meta charset="UTF-8"><meta http-equiv="x-ua-compatible" content="IE=edge"><meta name="viewport" content="width=device-width, initial-scale=1"><title>Title</title><style>li,ul,ol{ list-style: none; }a{ text-decoration: none; }</style> </head> <body> <ul>{% for book in list %}<li><a href="{{book.id}}">{{ book.btitle }}</a></li>{% endfor %} </ul> </body> </html>
上面{%%}之间包括的就是我们要从数据库取出的数据,进行填充。对于这样一个没有填充数据的html文件,浏览器是不能进行渲染的,所以,对于上述{%%}之间的内容先要被render进行渲染之后,才能发送给浏览器。
下面举个例子:
<!DOCTYPE html> <html lang="en"> <head><meta charset="UTF-8"><meta http-equiv="x-ua-compatible" content="IE=edge"><meta name="viewport" content="width=device-width, initial-scale=1"><title>Title</title><style>li,ul,ol{ list-style: none; }a{ text-decoration: none; }</style> </head> <body> <ul>{% for book in list %}<li><a href="{{book.id}}">{{ book.btitle }}</a></li>{% endfor %}</ul> </body> </html>
show.html
def show(request, id): book = BookInfo.objects.get(pk=id) #从数据库中取出对应id的数据herolist = book.heroinfo_set.all() context = {'list': herolist} # 将数据保存在listreturn render(request, 'booktest/show.html', context) #通过render进行模板渲染
2.redirect 函数
参数可以是:
- 一个模型:将调用模型的get_absolute_url() 函数
- 一个视图,可以带有参数:将使用urlresolvers.reverse 来反向解析名称
- 一个绝对的或相对的URL,将原封不动的作为重定向的位置。
默认返回一个临时的重定向;传递permanent=True 可以返回一个永久的重定向。
示例:
你可以用多种方式使用redirect() 函数。
传递一个对象
将调用get_absolute_url() 方法来获取重定向的URL:
1 2 3 4 5 6 |
|
传递一个视图的名称
可以带有位置参数和关键字参数;将使用reverse() 方法反向解析URL:
1 2 3 |
|
传递要重定向的一个硬编码的URL
1 2 3 |
|
也可以是一个完整的URL:
1 2 3 |
|
默认情况下,redirect() 返回一个临时重定向。以上所有的形式都接收一个permanent 参数;如果设置为True,将返回一个永久的重定向:
1 2 3 4 |
|
跳转(重定向)应用
-----------------------------------url.pyurl(r"login", views.login),url(r"yuan_back", views.yuan_back),-----------------------------------views.py def login(req):if req.method=="POST":if 1:# return redirect("/yuan_back/")name="yuanhao"return render(req,"my backend.html",locals())return render(req,"login.html",locals())def yuan_back(req):name="苑昊"return render(req,"my backend.html",locals())-----------------------------------login.html<form action="/login/" method="post"><p>姓名<input type="text" name="username"></p><p>性别<input type="text" name="sex"></p><p>邮箱<input type="text" name="email"></p><p><input type="submit" value="submit"></p> </form> -----------------------------------my backend.html <h1>用户{{ name }}你好</h1>
View Code
下面我们来看一个现象:
--------------------urls.py------------------------------urlpatterns = [url(r'^admin/', admin.site.urls),url(r'^login/', views.login),url(r'^index/', views.index,),# url(r'^register/', views.register,name='reg'),]------------------view.py------------------------------- def login(request):if request.method=='POST':username=request.POST.get('user')password=request.POST.get('pwd')if username=='yuan' and password=='123':# return render(request,'index.html')return redirect('/index/')else:return render(request,'login.html',{'info':'账号或密码错误'})else:return render(request,'login.html')def index(request):name='yuan'return render(request,'index.html',{'a':name})---------------login.html-------------------------------- <h1>登陆界面</h1> <form action="/login/" method="post"><p>姓名 <input type="text" name="user"></p><p>密码 <input type="password" name="pwd"></p><p><input type="submit"></p><p>{{ info }}</p> </form>---------------login.html-------------------------------- <h1>个人主页</h1> <h2>hello,{{ a}}</h2>
代码
首先,启动服务器后,我们进入login页面
正确输入姓名,密码后,此时执行redirect函数,结果如下
现在我们将redirect换成render,再重新走一遍看看,在login页面,正确输入姓名,密码后,结果如下:
细心的人会发现,用render函数执行后的,地址栏的地址没有变化,还是login,且页面上的{{a}}此时也没有被渲染,所以hello,后面没有内容显示!
对比render与redirect:
原因是
render: 只是返回页面内容,但是未发送第二次请求
redirect:发送了第二次请求,url更新
总结两者区别:
第一,render返回一个登陆成功后的页面,刷新该页面将回复到跳转前页面。而redirect则不会
第二,如果页面需要模板语言渲染,需要的将数据库的数据加载到html,那么render方法则不会显示这一部分,render返回一个登陆成功页面,不会经过url路由分发系统,也就是说,不会执行跳转后url的视图函数。这样,返回的页面渲染不成功;而redirect是跳转到指定页面,当登陆成功后,会在url路由系统进行匹配,如果有存在的映射函数,就会执行对应的映射函数。
https://www.cnblogs.com/huchong/p/7718393.html
Django - - - -视图层之视图函数(views)相关推荐
- django redirect传递参数_Django 视图层(四):视图函数 - views.py
介绍 一个视图函数(类),简称视图,是一个简单的Python 函数(类),它接受Web请求并且返回Web响应. 响应可以是一张网页的HTML内容,一个重定向,一个404错误,一个XML文档,或者一张图 ...
- Django框架之视图函数views
文章目录 一.视图函数 二.Request请求 1.前端参数解析 2.请求体参数 3.请求头参数 4.Cookies & Session 5.其他常用方法 三.Response返回 1.Htt ...
- Django的视图层简介
Django的视图层 视图函数 所谓视图函数,其实就是我们Django项目中各个应用中的views.py文件中定义的每个用来处理URL路由映射到这里的逻辑函数.一个视图函数简称视图,它是个简单的Pyt ...
- django ajax 更新表格_Django(反向解析,路由分发、名称空间、视图层、虚拟环境、Django版本、json,CBV)...
https://www.zhihu.com/video/1249117508688711680 每日测验 """ 今日考题 1.列举你知道的orm数据的增删改查方法 2. ...
- Django之路由层、视图层、模板层介绍
一.Django请求生命周期 1.路由层urls.py Django 1.11版本 URLConf官方文档 1.1 urls.py配置基本格式 from django.conf.urls import ...
- Django 2.1.3 视图层 内置CBV通用视图
内置的基于类的通用视图 1. 扩展通用视图 2. 对象的通用视图 3. 制作"友好"的模板上下文 4. 添加额外的上下文 5. 查看对象的子集 6. 动态过滤 7. 执行额外的工作 ...
- Django视图层总结
2019独角兽企业重金招聘Python工程师标准>>> 自定义path转换器 其实就是写一个类,并包含下面的成员和属性: 类属性regex:一个字符串形式的正则表达式属性: to_p ...
- Django之url和视图函数
URL-统一资源定位符(Uniform Resource Locator)用来表示互联网某个资源的地址,类比理解为windows下某个文件的路径.URL的一般语法格式为(注:[]代表其中的内容可省略) ...
- Django视图层:视图函数、视图类
一.视图层The view layer Django 具有 "视图" 的概念,负责处理用户的请求并返回响应. 二.视图函数 View functions mysite/views. ...
最新文章
- Transformers2.0让你三行代码调用语言模型,兼容TF2.0和PyTorch
- mysql基于binlog增量更新_一个应用它提取MySQL binlog,解析binlog并将增量更新数据推送到不同的接收器...
- 【数据分析】年轻人如何才能实现年薪百万呢?用数据分析来帮你探探路
- 【安全系列之加密算法】常用安全的加密算法
- java注解的继承_Java注解合并,注解继承
- 施一公获百万科学界大奖!科研大牛如何炼成?
- 第二阶段团队项目冲刺第一天
- 阿里明确中国数字商业板块组织架构 全面聚焦客户体验
- 11 User Space, Kernel Space, and the System Call API(用户空间,核空间,系统api)
- 第二阶段冲刺报告(六)
- BZOJ1588(HNOI2002)营业额统计
- Mac OS 系统工具使用
- 开源自动化运维平台Spug
- hive窗口函数(over)详解
- java8 lamda throw_【修炼内功】[Java8] Lambda表达式里的陷阱
- Linux驱动中私有数据filp-private_data的作用
- Django Channels 个人对官方文档大概理解 及一些地方的作用
- Python爬取《隐秘的角落》弹幕数据,实现简单可视化(附源码)
- Onedrive删除过程记录
- Java模拟HTTP/POST方式请求接口
热门文章
- Windows更新右下角出现 天气温度等提示,如何取消
- ++实现 ipv6数据报_IPV6报文格式和IPV4有什么区别?
- postman 使用_Postman使用方法
- dbeaver无法修改表数据_隐藏彩蛋:你知道python有一个内置的数据库吗?
- 经典数据结构——堆的实现
- asp 可否压缩_怎样用ASP压缩文件
- python内建函数测试对象身份_Python学习笔记 03 Python对象
- arduino串口输入改变模式模块
- 树莓派和微信和服务器,用树莓派搭建微信公共平台
- 字典哈希表的实现原理_GCC中unordered_(multi)set/map的实现原理 (Part 2 图解哈希表结构)...