一、路由配置系统(URLconf)

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

  1. '''
  2.  
  3. urlpatterns = [
    url(正则表达式, views视图函数,参数,别名),
    ]
  4.  
  5. 参数说明:
  6.  
  7. 一个正则表达式字符串
    一个可调用对象,通常为一个视图函数或一个指定视图函数路径的字符串
    可选的要传递给视图函数的默认参数(字典形式)
    一个可选的name参数
  8.  
  9. '''

1、URLconf的正则字符串参数

1.1 简单配置

  1. from django.conf.urls import url
  2.  
  3. from . import views
  4.  
  5. urlpatterns = [
  6. url(r'^articles/2003/$', views.special_case_2003),
  7. url(r'^articles/([0-9]{4})/$', views.year_archive),
  8. url(r'^articles/([0-9]{4})/([0-9]{2})/$', views.month_archive),
  9. url(r'^articles/([0-9]{4})/([0-9]{2})/([0-9]+)/$', views.article_detail),
  10. ]
  1. '''
  2. NOTE:
  3. 一旦匹配成功则不再继续
  4. 若要从URL 中捕获一个值,只需要在它周围放置一对圆括号。
  5. 不需要添加一个前导的反斜杠,因为每个URL 都有。例如,应该是^articles 而不是 ^/articles。
  6. 每个正则表达式前面的'r' 是可选的但是建议加上。
  7.  
  8. 一些请求的例子:
  9.  
  10. /articles/2005/3/ 不匹配任何URL 模式,因为列表中的第三个模式要求月份应该是两个数字。
  11. /articles/2003/ 将匹配列表中的第一个模式不是第二个,因为模式按顺序匹配,第一个会首先测试是否匹配。
  12. /articles/2005/03/ 请求将匹配列表中的第三个模式。Django 将调用函数
  13. views.month_archive(request, '2005', '03')。
  14. '''

1.2 有名分组(named group)

上面的示例使用简单的、没有命名的正则表达式组(通过圆括号)来捕获URL 中的值并以位置 参数传递给视图。在更高级的用法中,可以使用命名的正则表达式组来捕获URL 中的值并以关键字 参数传递给视图。

在Python 正则表达式中,命名正则表达式组的语法是(?P<name>pattern),其中name 是组的名称,pattern 是要匹配的模式。

下面是以上URLconf 使用命名组的重写:

  1. from django.conf.urls import url
  2.  
  3. from . import views
  4.  
  5. urlpatterns = [
  6. url(r'^articles/2003/$', views.special_case_2003),
  7. url(r'^articles/(?P<year>[0-9]{4})/$', views.year_archive),
  8. url(r'^articles/(?P<year>[0-9]{4})/(?P<month>[0-9]{2})/$', views.month_archive),
  9. url(r'^articles/(?P<year>[0-9]{4})/(?P<month>[0-9]{2})/(?P<day>[0-9]{2})/$', views.article_detail),
  10. ]

这个实现与前面的示例完全相同,只有一个细微的差别:捕获的值作为关键字参数而不是位置参数传递给视图函数。例如:

  1.   /articles/2005/03/
  2. 请求将调用views.month_archive(request, year='2005', month='03')函数
  3. /articles/2003/03/03/
  4. 请求将调用函数views.article_detail(request, year='2003', month='03', day='03')。

在实际应用中,这意味你的URLconf 会更加明晰且不容易产生参数顺序问题的错误 —— 你可以在你的视图函数定义中重新安排参数的顺序。当然,这些好处是以简洁为代价;有些开发人员认为命名组语法丑陋而繁琐。

1.3 URLconf 在什么上查找

URLconf 在请求的URL 上查找,将它当做一个普通的Python 字符串。不包括GET和POST参数以及域名。

例如,http://www.example.com/myapp/ 请求中,URLconf 将查找myapp/

在http://www.example.com/myapp/?page=3 请求中,URLconf 仍将查找myapp/

URLconf 不检查请求的方法。换句话讲,所有的请求方法 —— 同一个URL的POSTGETHEAD等等 —— 都将路由到相同的函数。

1.4 捕获的参数永远是字符串

每个捕获的参数都作为一个普通的Python 字符串传递给视图,无论正则表达式使用的是什么匹配方式。例如,下面这行URLconf 中:

  1. url(r'^articles/(?P<year>[0-9]{4})/$', views.year_archive),

views.year_archive() 的year 参数将是一个字符串

1.5 指定视图参数的默认值

有一个方便的小技巧是指定视图参数的默认值。 下面是一个URLconf 和视图的示例:

  1. # URLconf
  2. from django.conf.urls import url
  3.  
  4. from . import views
  5.  
  6. urlpatterns = [
  7. url(r'^blog/$', views.page),
  8. url(r'^blog/page(?P<num>[0-9]+)/$', views.page),
  9. ]
  10.  
  11. # View (in blog/views.py)
  12. def page(request, num="1"):
  13.  
  14. ...

在上面的例子中,两个URL模式指向同一个视图views.page —— 但是第一个模式不会从URL 中捕获任何值。如果第一个模式匹配,page() 函数将使用num参数的默认值"1"。如果第二个模式匹配,page() 将使用正则表达式捕获的num 值。

1.6 Including other URLconfs

  1. #At any point, your urlpatterns can “include” other URLconf modules. This
  2. #essentially “roots” a set of URLs below other ones.
  3.  
  4. #For example, here’s an excerpt of the URLconf for the Django website itself.
  5. #It includes a number of other URLconfs:
  6.  
  7. from django.conf.urls import include, url
  8.  
  9. urlpatterns = [
  10. url(r'^admin/', admin.site.urls),
  11. url(r'^blog/', include('blog.urls')),
  12. ]

2、传递额外的选项给视图函数

URLconfs 具有一个钩子,让你传递一个Python 字典作为额外的参数传递给视图函数。

django.conf.urls.url() 函数可以接收一个可选的第三个参数,它是一个字典,表示想要传递给视图函数的额外关键字参数。

例如:

  1. from django.conf.urls import url
  2. from . import views
  3.  
  4. urlpatterns = [
  5. url(r'^blog/(?P<year>[0-9]{4})/$', views.year_archive, {'foo': 'bar'}),
  6. ]

在这个例子中,对于/blog/2005/请求,Django 将调用views.year_archive(request, year='2005', foo='bar')

这个技术在Syndication 框架中使用,来传递元数据和选项给视图。

3、name参数

  1. '''
  2.  
  3. urlpatterns = [
  4. url(r'^index',views.index,name='INDEX'),
  5.  
  6. ]
  7. ###################
  8.  
  9. def index(req):
  10. if req.method=='POST':
  11. username=req.POST.get('username')
  12. password=req.POST.get('password')
  13. if username=='alex' and password=='':
  14. return HttpResponse("登陆成功")
  15.  
  16. return render(req,'index.html')
  17.  
  18. #####################
  19.  
  20. <!DOCTYPE html>
  21. <html lang="en">
  22. <head>
  23. <meta charset="UTF-8">
  24. <title>Title</title>
  25. </head>
  26. <body>
  27. {# <form action="/index/" method="post">#}
  28. <form action="{% url 'INDEX' %}" method="post">
  29. 用户名:<input type="text" name="username">
  30. 密码:<input type="password" name="password">
  31. <input type="submit" value="submit">
  32. </form>
  33. </body>
  34. </html>
  35.  
  36. #######################
  37.  
  38. '''

二、编写视图

一个视图函数,或者简短来说叫做视图,是一个简单的Python函数,它接受web请求,并且返回web响应。响应可以是一张网页的HTML内容,一个重定向,一个404错误,一个XML文档,或者一张图片. . . 是任何东西都可以。无论视图本身包含什么逻辑,都要返回响应。代码写在哪里也无所谓,只要它在你的Python目录下面。除此之外没有更多的要求了——可以说“没有什么神奇的地方”。为了能够把代码放在某个地方,惯例是把视图放在叫做views.py的文件中,然后把它放到你的项目或者应用目录里。

1、一个简单的视图

下面是一个返回当前日期和时间作为HTML文档的视图:

  1. from django.http import HttpResponse
  2. import datetime
  3.  
  4. def current_datetime(request):
  5. now = datetime.datetime.now()
  6. html = "<html><body>It is now %s.</body></html>" % now
  7. return HttpResponse(html)

让我们逐行阅读上面的代码:

  • 首先,我们从 django.http模块导入了HttpResponse类,以及Python的datetime库。
  • 接着,我们定义了current_datetime函数。它是一个视图函数。每个视图函数都应接收HttpRequest对象作为第一个参数,一般叫做request。
  • 注意视图函数的名称并不重要;不需要用一个统一的命名方式来命名,以便让Django识别它。我们将其命名为current_datetime,是因为这个名称能够精确地反映出它的功能。
  • 这个视图会返回一个HttpResponse对象,其中包含生成的响应。每个视图函数都要返回HttpResponse对象
  1. '''
    http请求-响应过程中有两个核心对象:
  2.  
  3. http请求对象:HttpRequest
  4.  
  5. http响应响应:HttpResponse
  6.  
  7. 所在位置:django.http
  8.  
  9. '''

2、快捷函数

2.1 render函数

  1. ---------------render(request, template_name[, context])
  2.  
  3. 结合一个给定的模板和一个给定的上下文字典,并返回一个渲染后的 HttpResponse 对象。
  4.  
  5. 参数:
  6. request 用于生成响应的请求对象。
  7.  
  8. template_name:要使用的模板的完整名称,可选的参数
  9.  
  10. context:添加到模板上下文的一个字典。默认是一个空字典。如果字典中的某个值是可调用的,视图将在渲染模板之前调用它。
  11.  
  12. content_type:生成的文档要使用的MIME类型。默认为DEFAULT_CONTENT_TYPE 设置的值。
  13.  
  14. status:响应的状态码。默认为200

2.2 redirect函数

  1. -----------------------------------url.py
  2.  
  3. url(r"login", views.login),
  4. url(r"yuan_back", views.yuan_back),
  5.  
  6. -----------------------------------views.py
  7. def login(req):
  8. if req.method=="POST":
  9. if 1:
  10. # return redirect("/yuan_back/")
  11. name="yuanhao"
  12.  
  13. return render(req,"my backend.html",locals())
  14.  
  15. return render(req,"login.html",locals())
  16.  
  17. def yuan_back(req):
  18.  
  19. name="苑昊"
  20.  
  21. return render(req,"my backend.html",locals())
  22.  
  23. -----------------------------------login.html
  24.  
  25. <form action="/login/" method="post">
  26. <p>姓名<input type="text" name="username"></p>
  27. <p>性别<input type="text" name="sex"></p>
  28. <p>邮箱<input type="text" name="email"></p>
  29. <p><input type="submit" value="submit"></p>
  30. </form>
  31. -----------------------------------my backend.html
  32. <h1>用户{{ name }}你好</h1>
  33.  
  34. #总结: render和redirect的区别:
  35. # 1 if render的页面需要模板语言渲染,需要的将数据库的数据加载到html,那么所有的这一部分
  36. # 除了写在yuan_back的视图函数中,必须还要写在login中,代码重复,没有解耦.
  37.  
  38. # 2 the most important: url没有跳转到/yuan_back/,而是还在/login/,所以当刷新后
  39. # 又得重新登录.

Django路由配置系统,视图函数的更多相关文章

  1. Django路由配置系统、视图函数

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

  2. Django路由配置

    Django路由配置系统.视图函数 1.路由配置系统(URLconf) URL配置(URLconf)就像Django 所支撑网站的目录.它的本质是URL与要为该URL调用的视图函数之间的映射表:你就是 ...

  3. Django视图层之路由配置系统(urls)

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

  4. django基础2: 路由配置系统,URLconf的正则字符串参数,命名空间模式,View(视图),Request对象,Response对象,JsonResponse对象,Template模板系统

    Django基础二 request request这个参数1. 封装了所有跟请求相关的数据,是一个对象 2. 目前我们学过1. request.method GET,POST ...2. reques ...

  5. Django基础--Django基本命令、路由配置系统(URLconf)、编写视图、Template、数据库与ORM

    web框架 框架,即framework,特指为解决一个开放性问题而设计的具有一定约束性的支撑结构. 使用框架可以帮你快速开发特定的系统. 简单地说,就是你用别人搭建好的舞台来做表演. 尝试搭建一个简单 ...

  6. day 53-1 Django基础三之视图函数

    Django基础三之视图函数   本节目录 一 Django的视图函数view 二 CBV和FBV 三 使用Mixin 四 给视图加装饰器 五 Request对象 六 Response对象 一 Dja ...

  7. day 67 Django基础三之视图函数

    Django基础三之视图函数   本节目录 一 Django的视图函数view 二 CBV和FBV 三 使用Mixin 四 给视图加装饰器 五 Request对象 六 Response对象 一 Dja ...

  8. django重点url,视图函数,模板语言

    django重点url,视图函数,模板语言url 1.django重点url无命名分组:re_path() 2.url第一个参:url未命别名分组就不需要views中参数一定,若命别名(?P<y ...

  9. Django 的 一些基本操作:视图函数,路由配置

    当安装好Django 通过上篇的随笔创好项目我们就能来耍下了, 但你会在你的项目中发现有一个settings.py 的文件,对的你肯定想到了需要配置,好了话不多说 Settings.py 找到下面的位 ...

随机推荐

  1. C# 反射常见用法

    定义: 反射是.NET中的重要机制,通过反射,可以在运行时获得程序或程序集中每一个类型(包括类.结构.委托.接口和枚举等)的成员和成员的信息.有了反射,即可对每一个类型了如指掌.另外我还可以直接创建对 ...

  2. Android权限管理

    使用系统权限 为了保护系统的完整性和用户隐私权,Android 在访问受限的沙盒中运行每款应用.如果应用需要使用其沙盒以外的资源或信息,则必须明确请求权限.根据应用请求的权限类型,系统可能会自动授予权 ...

  3. Swoole 结合TP5搭建文字直播平台

    直播模块流程: 主进程服务:主进程同时开启两个服务 http服务,负责向前端传递页面,处理登录等事务 websocket服务,服务处理直播以及聊天室等事务 在项目根目录(框架代码同级目录)建立scri ...

  4. python 网页爬虫,带登陆信息

    注意点: 1. 用Fiddler抓取登陆后的headers,cookies; 2. 每抓取一次网页暂停一点时间防止反爬虫; 3. 抓取前,需要关闭Fiddler以防止端口占用. 还需解决的问题: 爬取 ...

  5. 深度学习原理与框架-RNN网络架构-RNN网络 1.RNN的前向传播 2.RNN的反向传播

    对于神经网络而言,每一个样本的输入与输入直接都是独立的,即预测的结果之间并没有联系 而对于RNN而言:不仅仅是有当前的输入,而且上一层的隐藏层也将进行输入,用于进行结果的预测.因此每一个输入都与之前的 ...

  6. Centos6 下安装Nginx+Mysql+PHP

    安装nginx https://segmentfault.com/a/1190000007928556 添加源 $ wget http://nginx.org/packages/centos/6/no ...

  7. Delphi 使用MD5 比对文件

    使用MD5的方法比对CXimage里图片是否改变: Delphi7实现方法: uses IdHashMessageDigest function TForm1.GetImageMD5(cxImage: ...

  8. Haskell语言学习笔记(78)fix

    fix 函数 fix 是一个在 Data.Function 模块中定义的函数,它是对于递归的封装,可以用于定义不动点函数. fix :: (a -> a) -> a fix f = let ...

  9. vmware搭建lnmp环境配置域名

    找到nginx配置文件,修改server_name 然后找到/etc/hosts文件 修改成如下 之后在Windows本地的C盘的hosts文件中添加解析 好了,这样就可以访问了 通往牛逼的路上,在意 ...

  10. JS封装Cookie

    /* @黑眼诗人 <www.farwish.com> */<script> //设置cookie: cookie名,cookie值,天数 function setCookie( ...