一、URL路由映射

  路由映射模块,主要完成url与views视图函数的映射。当一个url请求到来时,会按照这个模块中的url地址从上到下进行匹配,如果匹配成功,将执行映射试图中的函数;反之将返回404错误。

  1.基本介绍

urlpatterns = []  #里面存放一条条的路由映射关系。
url(正则表达式, 映射函数,参数[可选],别名[可选])
  • 正则匹配中,如果带了括号,那么该括号中的内容会当作参数传递到对应的视图函数中去。
  • 别名,在文件路径发生变化时用处非常大。

  2.配置路由

  常规正则匹配

from django.conf.urls import url
from django.contrib import admin
from testfile import views urlpatterns = [
url(r'^admin/', admin.site.urls), #系统生成的映射
   url(r‘^$/’,index)       # 匹配首页                     #注意里面的任意一条映射匹配成功,后面的则不在匹配
url(r'^articles/2003/$', views.special_case_2003), #表示articles/2003/这个路径映射views模块的special_case_2003函数
url(r'^articles/([0-9]{4})/$', views.year_archive), #表示2003可以是0-9的任意4个数字
url(r'^articles/([0-9]{4})/([0-9]{2})/$', views.month_archive), #表示匹配二级目录
url(r'^articles/([0-9]{4})/([0-9]{2})/([0-9]+)/$', views.article_detail), #表示匹配三级目录
]

  注意:上面匹配都加了小括号,这些括号里面的值会当作参数传递到后面的函数中,也就是,views.special_case_2003中.....

  路径命名

from django.conf.urls import url
from django.contrib import admin
from testfile import views urlpatterns = [
url(r'^admin/', admin.site.urls), #系统生成的映射
url(r'^(?P<year>articles/2003)/$', views.month_views), #表示articles/2003/这个路径映射views模块的month_views函数

  如果给路径命名了,那么对应的视图函数中,必须按照该命名作为形参。

  别名

urlpatterns = [
url(r'^admin/', admin.site.urls), #系统生成的映射
url(r'^reg/$', views.month_views,name='register')

  而在访问的静态文件中,

<!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> </head>
<body>
  <form method='post' action='{% register %}'>xxxx</form>
</body>
</html>

  当我们后端的路径发生变化时,前端的页面不用改变任何代码,都能够正常访问。

  3.路由应用分发

  如果一个网站很多,有很多app应用,那么就需要很多路由分发。如果将所有的路由分发都放在urlconf文件下,這样会使得文件不易于管理,为此,我们可以给每一个app都创建一个urls.py文件,然后再urlconf中的urlpatterns中将该urls.py文件包含进来就行了。

from django.conf.urls import include, url # 导入全局url
urlpatterns = [
url(r'^blog', include('blog.urls')), #将访问路径以bug开头的路径分发到app1下的urls.py模块里进行路由映射
]

   这样在我们blog-app中的url中,存放所有关于blog的url分发工作。

urlpatterns = [
url(r'^2004/$', year_2004),
url(r'^(\d{4})/$', year_query),
url(r'^(\d{4})/(\d{2})$', year_query),
url(r'^(?P<year>\d{4})/(?P<month>\d{2})$', year_query),
]

  这样我们访问网站应该是:http://localhost:8080/blog/2012/3  前面都得带上app的名称

二、View视图

            

    视图函数,围绕着两个对象进行:HttpResponse和HttpRequest

  1.HttpRequest

  • 属性
request.path   # 获取访问文件路径

request.method属性 #获取请求中使用的HTTP方式(POST/GET)

request.GET  #  获取HTTP GET方式请求传参(字典类型)

request.POST #       包含所有HTTP POST参数的类字典对象

request.COOKIES  #包含所有cookies的标准Python字典对象;keys和values都是字符串。

request.FILES  #包含所有上传文件的类字典对象

request.user  # 是一个django.contrib.auth.models.User对象,代表当前登陆的用户

request.session # 唯一可读写的属性,代表当前会话的字典对象
  • 示例
from django.shortcuts import render,HttpResponse

def special(request):
print(request.path)
   print(requst.method)
return render(request,'index.html')

  2.HttpResponse

   对于HttpRequest请求对象来说,是由django自动创建的,但是,HttpResponse响应对象就必须我们自己创建。每个view请求处理方法必须返回一个HttpResponse响应对象。HttpResponse类在django.http.HttpResponse。

  • 在HttpResponse对象上扩展的常用方法
  1. render(请求对象,'html文件和路径')方法,将指定页面渲染后返回给浏览器
from django.shortcuts import render

def 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 calling
django.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进行渲染之后,才能发送给浏览器。总结一句话就是,render方法作用就是-----填坑。

  关于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} # 将数据保存在list
return render(request, 'booktest/show.html', context) #通过render进行模板渲染

  2.render_to_response('html文件和路径')方法,将指定页面渲染后返回给浏览器

from django.shortcuts import render

def test(request):
return render_to_reponse(request,'index.html') #向用户显示一个html页面

  下面为render_to_reponse源码:

def render_to_response(template_name, context=None, content_type=None, status=None, using=None):
"""
Returns a HttpResponse whose content is filled with the result of calling
django.template.loader.render_to_string() with the passed arguments.
"""
content = loader.render_to_string(template_name, context, using=using)
return HttpResponse(content, content_type, status)

  3.redirect('跳转路径和名称')方法,页面跳转

from django.shortcuts import render,render_to_response,redirect
def test(request):
  return redirect('http://www.jxiou.com/') #跳转页面

  注意:render与redirect两点区别:

     我们来模拟一个登陆网页,当我登陆成功后,跳转到另一个页面,分别用render与redirect来试试。

     总结两者区别:    

     第一,render返回一个登陆成功后的页面,刷新该页面将回复到跳转前页面。而redirect则不会

       第二,render返回一个登陆成功页面,不会经过url路由分发系统,也就是说,不会执行跳转后url的试图函数。这样,返回的页面渲染不成功;而redirect是跳转到指定页面,当登陆成功后,会在url路由系统进行匹配,如果有存在的映射函数,就会执行对应的映射函数。

     

    我们在网页访问login地址,注意地址栏的变化,

     

    当我们输入正确登陆账号和密码后,跳转到另外一个页面地址:     

    当我们刷新后,这个页面保持不变。而且内容正常显示

    现在,我们换成render,返回同样的页面试试: 

   观察到区别了没有,我们登陆成功后,页面的地址并没有变,而且模板也没有进行渲染。

  

Django-url路由映射与views逻辑处理的更多相关文章

  1. django URL路由基础

    URL是Web服务的入口,用户通过浏览器发送过来的任何请求,都是发送到一个指定的URL地址,然后被响应. 在Django项目中编写路由,就是向外暴露我们接收哪些URL的请求,除此之外的任何URL都不被 ...

  2. Django URL (路由系统)

    URL配置(URLconf)就像Django 所支撑网站的目录.它的本质是URL模式以及要为该URL模式调用的视图函数之间的映射表:你就是以这种方式告诉Django,对于这个URL调用这段代码,对于那 ...

  3. django url 路由设置技巧

    Django的url使用方法 利用Django开发站点.能够设计出很优美的url规则,假设url的匹配规则(包括正則表達式)组织得比較好,view的结构就会比較清晰.比較easy维护. 最简单的形式 ...

  4. django url路由参数错误

    出现错误: TypeError get() got an unexpected keyword argument 'teacher_id 出错原因: view类中,get方法获得了一个多余的额参数,这 ...

  5. python :Django url /views /Template 文件介绍

    1,Django URL 路由系统 URL配置(URLconf)就像Django 所支撑网站的目录.它的本质是URL模式以及要为该URL模式调用的视图函数之间的映射表:你就是以这种方式告诉Django ...

  6. URL路由系统-命名空间

    命名空间 1.工程Django下的urs.py from django.conf.urls import url,include from django.urls import path,re_pat ...

  7. 第三百零四节,Django框架,urls.py模块,views.py模块,路由映射与路由分发以及逻辑处理——url控制器

    Django框架,urls.py模块,views.py模块,路由映射与路由分发以及逻辑处理——url控制器 这一节主讲url控制器 一.urls.py模块 这个模块是配置路由映射的模块,当用户访问一个 ...

  8. 二 Django框架,urls.py模块,views.py模块,路由映射与路由分发以及逻辑处理——url控制器

    Django框架,urls.py模块,views.py模块,路由映射与路由分发以及逻辑处理——url控制器 这一节主讲url控制器 一.urls.py模块 这个模块是配置路由映射的模块,当用户访问一个 ...

  9. day64 url用法以及django的路由系统

    此篇博客是以备后查的,用到的时候记得过来查找即可! 路由系统:就是我们的django项目创建的时候自带的那个urls.py 它本身里面是映射的对应关系,一个大的列表里面,一个个元祖,元祖里面是url或 ...

随机推荐

  1. 【Linux 命令】iftop安装与简单使用

    iftop是linux下的一个流量监控工具,用于查看实时网络流量,反向解析IP,显示端口信息官网:http://www.ex-parrot.com/~pdw/iftop/ 1.安装必须软件包 yum ...

  2. 【leetcode 简单】 第九十九题 字符串相加

    给定两个字符串形式的非负整数 num1 和num2 ,计算它们的和. 注意: num1 和num2 的长度都小于 5100. num1 和num2 都只包含数字 0-9. num1 和num2 都不包 ...

  3. Python概念-禁锢术之__slots__

    之所以给它起名为禁锢术,并非空缺来风,下面我们来了解一下__slost__ __slost__:其实就是将类中的名称锁定,实例化对象,只可以赋值和调用,不可以删除名字和增加新的名字 代码示例:(实例化 ...

  4. ASP.NET 网站部署到IIS上如何进行调试

    1:在一个网站成功部署后,有可能会遇到一些错误,但是又不能直接看出错误源(如果能在源程序里下断点进行调试就好了,这样就能准确的找出错误代码),下面介绍如何在一个已经部署的网站上进行断点调试(前提有网站 ...

  5. 20155303 2016-2017-2 《Java程序设计》第九周学习总结

    20155303 2016-2017-2 <Java程序设计>第九周学习总结 目录 学习内容总结(Linux命令) 教材学习中的问题和解决过程 代码调试中的问题和解决过程 代码托管 上周考 ...

  6. Linux XOR.DDoS样本取证特征与清除

    一.取证特征 1)获取进程ID 使用top命令,查看占用内存率最高的十位随机名称进程名(示例:进程名pygdykcrqf) 2)获取进程对应路径 Linux 在启动一个进程时,系统会在/proc下创建 ...

  7. MySQL 删除数据

    删除数据的语句有三种:DELETE.DROP.TRUNCATE. 1.DELETE语句 DELETE 语句用于删除表中的行. 语法 DELETE FROM 表名称 WHERE 列名称 = 值 例如 - ...

  8. [HBase]mem store flusher 流程

  9. Flask:使用Eclipse+PyDev插件编辑基于package的项目

    Windows 10家庭中文版,Python 3.6.4,Flask 1.0.2,Eclipse Oxygen.1a Release (4.7.1a),PyDev 6.3.2 本文记录了 使用Ecli ...

  10. cbow&&skipgram详细

    前面:关于层次huffman树和负例采样也要知道的,这里就不详细写了 来源于:https://mp.weixin.qq.com/s?__biz=MzI4MDYzNzg4Mw==&mid=224 ...