阅读目录(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

Django - - - -视图层之视图函数(views)相关推荐

  1. django redirect传递参数_Django 视图层(四):视图函数 - views.py

    介绍 一个视图函数(类),简称视图,是一个简单的Python 函数(类),它接受Web请求并且返回Web响应. 响应可以是一张网页的HTML内容,一个重定向,一个404错误,一个XML文档,或者一张图 ...

  2. Django框架之视图函数views

    文章目录 一.视图函数 二.Request请求 1.前端参数解析 2.请求体参数 3.请求头参数 4.Cookies & Session 5.其他常用方法 三.Response返回 1.Htt ...

  3. Django的视图层简介

    Django的视图层 视图函数 所谓视图函数,其实就是我们Django项目中各个应用中的views.py文件中定义的每个用来处理URL路由映射到这里的逻辑函数.一个视图函数简称视图,它是个简单的Pyt ...

  4. django ajax 更新表格_Django(反向解析,路由分发、名称空间、视图层、虚拟环境、Django版本、json,CBV)...

    https://www.zhihu.com/video/1249117508688711680 每日测验 """ 今日考题 1.列举你知道的orm数据的增删改查方法 2. ...

  5. Django之路由层、视图层、模板层介绍

    一.Django请求生命周期 1.路由层urls.py Django 1.11版本 URLConf官方文档 1.1 urls.py配置基本格式 from django.conf.urls import ...

  6. Django 2.1.3 视图层 内置CBV通用视图

    内置的基于类的通用视图 1. 扩展通用视图 2. 对象的通用视图 3. 制作"友好"的模板上下文 4. 添加额外的上下文 5. 查看对象的子集 6. 动态过滤 7. 执行额外的工作 ...

  7. Django视图层总结

    2019独角兽企业重金招聘Python工程师标准>>> 自定义path转换器 其实就是写一个类,并包含下面的成员和属性: 类属性regex:一个字符串形式的正则表达式属性: to_p ...

  8. Django之url和视图函数

    URL-统一资源定位符(Uniform Resource Locator)用来表示互联网某个资源的地址,类比理解为windows下某个文件的路径.URL的一般语法格式为(注:[]代表其中的内容可省略) ...

  9. Django视图层:视图函数、视图类

    一.视图层The view layer Django 具有 "视图" 的概念,负责处理用户的请求并返回响应. 二.视图函数 View functions mysite/views. ...

最新文章

  1. Transformers2.0让你三行代码调用语言模型,兼容TF2.0和PyTorch
  2. mysql基于binlog增量更新_一个应用它提取MySQL binlog,解析binlog并将增量更新数据推送到不同的接收器...
  3. 【数据分析】年轻人如何才能实现年薪百万呢?用数据分析来帮你探探路
  4. 【安全系列之加密算法】常用安全的加密算法
  5. java注解的继承_Java注解合并,注解继承
  6. 施一公获百万科学界大奖!科研大牛如何炼成?
  7. 第二阶段团队项目冲刺第一天
  8. 阿里明确中国数字商业板块组织架构 全面聚焦客户体验
  9. 11 User Space, Kernel Space, and the System Call API(用户空间,核空间,系统api)
  10. 第二阶段冲刺报告(六)
  11. BZOJ1588(HNOI2002)营业额统计
  12. Mac OS 系统工具使用
  13. 开源自动化运维平台Spug
  14. hive窗口函数(over)详解
  15. java8 lamda throw_【修炼内功】[Java8] Lambda表达式里的陷阱
  16. Linux驱动中私有数据filp-private_data的作用
  17. Django Channels 个人对官方文档大概理解 及一些地方的作用
  18. Python爬取《隐秘的角落》弹幕数据,实现简单可视化(附源码)
  19. Onedrive删除过程记录
  20. Java模拟HTTP/POST方式请求接口

热门文章

  1. Windows更新右下角出现 天气温度等提示,如何取消
  2. ++实现 ipv6数据报_IPV6报文格式和IPV4有什么区别?
  3. postman 使用_Postman使用方法
  4. dbeaver无法修改表数据_隐藏彩蛋:你知道python有一个内置的数据库吗?
  5. 经典数据结构——堆的实现
  6. asp 可否压缩_怎样用ASP压缩文件
  7. python内建函数测试对象身份_Python学习笔记 03 Python对象
  8. arduino串口输入改变模式模块
  9. 树莓派和微信和服务器,用树莓派搭建微信公共平台
  10. 字典哈希表的实现原理_GCC中unordered_(multi)set/map的实现原理 (Part 2 图解哈希表结构)...