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

get_full_path()

注意:键值对的值是多个的时候,比如checkbox类型的input标签,select标签,需要用:

1

request.POST.getlist("hobby")

 

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

from django.shortcuts import redirect

 

def my_view(request):

    ...

    object = MyModel.objects.get(...)

    return redirect(object)

传递一个视图的名称

可以带有位置参数和关键字参数;将使用reverse() 方法反向解析URL: 

1

2

3

def my_view(request):

    ...

    return redirect('some-view-name', foo='bar')

传递要重定向的一个硬编码的URL

1

2

3

def my_view(request):

    ...

    return redirect('/some/url/')

也可以是一个完整的URL:

1

2

3

def my_view(request):

    ...

    return redirect('http://example.com/')

默认情况下,redirect() 返回一个临时重定向。以上所有的形式都接收一个permanent 参数;如果设置为True,将返回一个永久的重定向:

1

2

3

4

def my_view(request):

    ...

    object = MyModel.objects.get(...)

    return redirect(object, permanent=True)  

跳转(重定向)应用

复制代码

-----------------------------------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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/568627.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Excel】设计简单抽奖小程序

其实我们可以通过excel做一个抽奖的小程序。比如搞活动送奖品&#xff0c;我们就可以通过这个小程序抽中奖名单 中奖名单下面输入“INDIRECT("A"&RANDBETWEEN(4,12))”&#xff0c;然后按F9进行抽奖 其中用到了两个函数INDIRECT(单元格引用&#xff0c;[引用样式…

【Python】retrying模块使用场景

大家在做数据抓取或者用selenium自动化进行元素定位的时候&#xff0c;经常遇到由于网络问题导致的抓取数据失败&#xff0c;或者定位元素失败。 针对这种情况&#xff0c;我们可以通过设置等待时间去控制&#xff0c;其实还有一种方法&#xff0c;就是使用retrying&#xff0c…

Django连接现有mysql数据库

1、打开cmd后cd到项目位置 2、建立项目 django-admin startproject test2 3、编辑项目中的配置文件, mysite/settings.py ,告诉Django你的数据库连接参数和数据库名。具体的说&#xff0c;要提供 DATABASE_NAME , DATABASE_ENGINE , DATABASE_USER , DATABASE_PASSWORD , DATA…

关于Django中的数据库操作API之distinct去重的一个误传

django提供的数据库操作API中的distinct()函数&#xff0c;了解SQL语句的读者都应该知道&#xff0c;DISTINCT关键字可以在select操作时去重。django里的这个distinct()函数也是这个功能&#xff0c;通常的用法是我们要取出一张表中的某一列的所有值&#xff0c;并且只取出不重…

【工具】Jupyter Notebook介绍

在数据分析的道路上&#xff0c;你一定曾有过为新发现而激动不已的时刻&#xff0c;此时你急于将自己的发现告诉大家&#xff0c;却遇到了这样的问题&#xff1a;如何将我的分析过程清晰地表述出来呢&#xff1f; 为了能与同行们有效沟通&#xff0c;你需要重现整个分析过程&am…

Django模板之显示QuerySet内容,字典中内容

camera和idproject都为QuerySet&#xff0c;如下图为验证 camera内容显示方法为&#xff1a; 可以看出idproject中迭代为dict类型。HTML中读写形式为&#xff1a; 显示结果&#xff1a; 参考自 https://blog.csdn.net/gaoxiaoba/article/details/52469614

【Python】这些Python骚操作,你值得拥有

Python 我用的比较多一点&#xff0c;对一些小玩意有些许了解。我不大清楚骚操作怎么定义&#xff0c;只好说说我觉得 Python 和其它语言&#xff08;比如 C 和 JAVA 等&#xff09;设定比较奇特的地方。 看了后&#xff0c;说不定你马上就有玩一玩 Python 的冲动了。 0x00 世…

Python的os.walk()方法详细讲解

我们可以看到&#xff0c;返回的是一个元组&#xff0c;元祖每一个元素即上面一行的内容&#xff0c;所以用for去遍历它。 然后对应的将这行的第一列的内容给root 第二列 给dirs 第三列 给files 元组每一个元素就是遍历一棵树(包括子树) 根的孩子&#xff08;注意 不…

【批处理】windows环境将文件隐藏到图片中

有时候有些敏感的文件不希望别人知道&#xff0c;我们有很多方法&#xff0c;今天我们介绍的方法是将文件隐藏到图片中去。方法如下&#xff1a; 1. 先将要隐藏的文件压缩到一个rar文件放在一个目录&#xff0c;比如&#xff1a;视频.rar 2. 在同一目录下放置一张图片IMG_4337.…

【批处理】windows环境将文件放置在虚拟盘

上一个文章我们说了如何将敏感文件隐藏到图片中&#xff0c;那个其实还是有点麻烦&#xff0c;要的时候需要改文件后缀名&#xff0c;而且通过文件的大小可以看出图片可疑。 上一文章链接&#xff1a;https://blog.csdn.net/sinat_37967865/article/details/83047245 今天我们…

No module named 'crispy_forms'等使用pycharm开发

我在最近的django开发过程中遇到一些问题&#xff0c;就是我在github上下载xadmin源码包之后&#xff0c;然后setings之中也进行了配置&#xff0c;出现了如下问题 但是我按照报错的信息觉得应该时这个模块没有安装&#xff0c;所以我使用pip进行安装然后又报错了&#xff0c;…

【Word】一些实用的小技巧

目录&#xff1a; 一、快速输入上下标文字 二、快速输入方框√ 三、竖向删除每行相同文字 一、【Word】快速输入上下标文字 有时候在用word处理文本时&#xff0c;不免要用一些上下标文字&#xff0c;比如算数用的平方立方&#xff0c;化学方程式 CH42O2 点燃 CO22H2O a2 b2…

【Excel】设置自定义单元格格式

我们知道Excel中设置单元格格式时可以通过自定义方式设置格式&#xff0c;但是具体如何使用一般人都不是很清楚&#xff0c;其实自定义功能非常强大。本文主要介绍一下自定义单元格格式的小技巧&#xff0c;主要流程&#xff1a; 1.选中要设置单元格格式的单元格&#xff0c;通…

pycharm可视化数据库

注意&#xff1a;pycharm社区版本身没有database 网上教程都是直接打开右上角的database&#xff0c;但是我死活也没找到&#xff0c;后来发现应该是因为社区版的问题&#xff0c;需要自己安装&#xff0c;详细步骤如下图。 1.打开File—》Settings—-》Plugins搜索database&a…

Django实现省市县级联菜单

1、创建工程mymenu和项目menu。 2、改变mymenu中setting.py的DIRS&#xff0c;STATICFILES_DIRS DIRS: [BASE_DIR "/templates"], #后面若无数据&#xff0c;不可以加逗号 STATICFILES_DIRS (os.path.join(BASE_DIR,static), ) 3、在menu中建立views.py和mode…

【Python】xlwt和xlrd模块写入和读取.xls版本EXCEL

我们经常与EXCEL打交道&#xff0c;其实我们可以使用python的相应模块去处理EXCEL文件。2003以前的表格以.xls后缀&#xff0c;用xlwt来写表格&#xff0c;用xlrd来读取表格&#xff1b;搭配xlutils修改表格。2007的表格以.xlsx后缀&#xff0c;用openpyxl来读写表格。 以下是…

echarts.js:1136 Uncaught Error: Initialize failed: invalid dom.

1、错误描述 echarts.js:1136 Uncaught Error: Initialize failed: invalid dom. 2、错误原因 <!DOCTYPE html><html><head><meta charset"UTF-8"><title></title><link rel"shortcut icon" href"../js/echar…

Fiddler在PC/台式对Android进行抓包

Fiddler是一个常用的http抓包工具&#xff0c;它能够记录电脑和移动端的进出数据&#xff0c;而且操作十分简便&#xff0c;下面主要介绍在台式机上Fiddler如何对Android进行数据抓包&#xff0c;本人使用的Fiddler版本为v5.0&#xff0c;文章主要知识点如下&#xff1a; 1.手机…

Echars折线配置详解

Echars折线配置详解 比如做成如下效果图&#xff1a; 所有的配置如下&#xff1a; var option {tooltip: { // 提示框trigger: axis, // 触发类型(坐标轴触发)alwaysShowContent: false, // 是否永远显示提示框的内容backgroundColor: rgba(32, 174, 252, 0.7), // 提示框…

【Python爬虫】爬取微信公众号文章信息准备工作

有一天发现我关注了好多微信公众号&#xff0c;那时就想有没有什么办法能够将微信公众号的文章弄下来&#xff0c;而且还想将一些文章的精彩评论一起搞下来。参考了一些文章&#xff0c;通过几天的研究基本上实现了自己的要求&#xff0c;现在记录一下自己的一些心得。 整个研…