URL分发器(视图层)
目录
视图
视图一般都写在 app 的 views.py 中。并且视图的第一个参数永远都是 request (一个HttpRequest)对象。这个对象存储了浏览器请求过来的所有信息,包括携带的参数以及一些头部信息等。在视图中,一般是完成逻辑相关的操作。比如这个请求是添加一篇博客,那么可以通过 request 来接收到这些数据,然后存储到数据库中,最后再把执行的结果返回给浏览器。视图函数的返回结果必须是 HttpResponseBase 对象或者其子类的对象。示例代码如下:
from django.http import HttpResponse
def first_page(request):
return HttpResponse("Hello,word!Django")
URL映射

视图写完后,要与URL进行映射,也即用户在浏览器中输入什么 url 的时候可以请求到这个视图函数。在用户输入了某个 url ,请求到我们的网站的时候, django 会从项目的 urls.py 文件中寻找对应的视图。在 urls.py 文件中有一个 urlpatterns 变量,以后 django 就会从这个变量中读取所有的匹配规则。匹配规则需要使用 django.urls.path 函数进行包裹,这个函数会根据传入的参数返回 URLPattern 或者是 URLResolver 的对象。示例代码如下:
from django.contrib import admin
from django.urls import path
from first_app import views
urlpatterns = [
path('admin/', admin.site.urls),
path('',views.first_page)
]

path函数
path(route,view,kwargs,name)
route:是一个匹配 URL 的准则(类似正则表达式)。当 Django 响应一个请求时,它会从urlpatterns的第一项开始,按顺序依次匹配列表中的项,直到找到匹配的项。这些准则不会匹配 GET 和 POST 参数或域名。例如,URLconf 在处理请求https://www.example.com/myapp/时,它会尝试匹配myapp/。处理请求https://www.example.com/myapp/?page=3时,也只会尝试匹配myapp/。view:当 Django 找到了一个匹配的准则,就会调用这个特定的视图函数,并传入一个HttpRequest对象作为第一个参数,被“捕获”的参数以关键字参数的形式传入。kwargs:任意个关键字参数可以作为一个字典传递给目标视图函数name:为你的 URL 取名能使你在 Django 的任意地方唯一地引用它,尤其是在模板中。这个有用的特性允许你只改一个文件就能全局地修改某个 URL 模式。
URL中传入参数
普通传入参数
有时候, url 中包含了一些参数需要动态调整。比如简书某篇文章的详情页的url,是 https://www.jianshu.com/p/a5aab9c4978e 后面的 a5aab9c4978e 就是这篇文章的 id ,那么简书的文章详情页面的url就可以写成 https://www.jianshu.com/p/<id> ,其中id就是文章的id。那么如何在 django 中实现这种需求呢。这时候我们可以在 path 函数中,使用尖括号的形式来定义一个参数。比如我现在想要获取一本书籍的详细信息,那么应该在 url 中指定这个参数。示例代码
如下:
from django.contrib import admin
from django.urls import path
urlpatterns = [
path('admin/', admin.site.urls),
path('book/<book_id>/',views.book_list)
]
而我们的 views.py 中的代码如下:
def book_list(request,book_id):
text = "您输入的书籍的id是:%s" % book_id
return HttpResponse(text)

注:我们 urls.py中path函数的变量,也就是 <book_id>中的book_id 一定要和 views.py中函数接收的参数book_id是一致的
变量形式传入参数
当然,也可以通过查询字符串的方式传递一个参数过去。这样就不用<>了,示例代码如下:
urlpatterns = [
path('admin/', admin.site.urls),
path('bookid/',views.book_detail)
]
而在 views.py 中的函数也不用接收另外的参数了,代码如下:
def book_detail(request):
book_id = request.GET.get("id")
text = "您输入的书籍id是:%s" % book_id
return HttpResponse(text)
以后在访问的时候就是通过 /bookid?id=123 即可将参数传递过去。

URL中包含另一个urls模块
在我们的项目中,不可能只有一个 app ,如果把所有的 app 的 views 中的视图都放在 urls.py 中进行映射,肯定会让代码显得非常乱。因此 django 给我们提供了一个方法,可以在 app 内部包含自己的 url 匹配规则,而在项目的 urls.py 中再统一包含这个 app 的 urls 。
比如,现在我们的项目有三个app
- front:管理前端的应用
- cmd:管理后端的应用
- first_app:处理逻辑的应用

我们可以在我们每个app内部,建立 urls.py文件。
比如,在cms中,我们建立的urls.py如下
from django.urls import path
from . import views
urlpatterns=[
path("",views.index),
path("login/",views.login)
]
views.py文件如下
from django.http import HttpResponse
def index(request):
return HttpResponse("CMS首页")
def login(request):
return HttpResponse("CMS登录页面")
然后我们在整个项目的 urls.py文件中可以如下:
# first_project/urls.py文件:
from django.contrib import admin
from django.urls import path,include
urlpatterns = [
path('admin/', admin.site.urls),
path("",include("front.urls")),
path('cms/',include("cms.urls"))
]
然后以后我们访问cms下的内容的话,在cms的urls.py中,默认是在cms/ 路径下的。


URL命名、URL反转、应用命名空间
为什么需要给URL命令?
因为 url 是经常变化的,如果在代码中写死的话,后续可能会经常改代码,给 url 取个名字,以后使用 url 的时候就使用它的名字进行反转就可以了。
给url命名如下:
urlpattern=[
path("login/",views.login,name="login") #将该url命名为login
]
那么,我们怎么利用这个url的名字得到url的绝对路径呢?
我们可以进行url反转,将url名字转换成url的绝对路径
login_url = reverse('login') #URL反转,将url名字反转成url的绝对路径
为什么需要应用命名空间?
比如,我们在 front 应用中 login/ 页面命名为login,在cms的 login/页面也命名为login,那么,在反转url的时候就会出错了。
比如我们在cms项目中的urls.py中给应用命名如下
from django.urls import path
from . import views
app_name="cms" #给应用命名为cms
urlpatterns=[
path("",views.index),
path("login/",views.login)
]
那么,我们在反转的时候,只需要在名字前面指定我们的应用名字就行了
login_url = reverse('cms:login') #指定cms应用下的名字为login的url
本文的代码:链接: https://pan.baidu.com/s/1t1naj5rK1JZg5d66PRvDEg 提取码: 1hd8
URL分发器(视图层)的更多相关文章
- Django url分发器
视图: 视图一般都写在app的views.py中.并且视图的第一个参数永远都是request(一个HttpRequest)对象.这个对象存储了请求过来的所有信息,包括携带的参数以及一些头部信息等.在视 ...
- Django drf:视图层封装、ViewSetMixin、路由配置、解析器、响应器
一.视图层封装 二.ViewSetMixin 三.路由配置 四.解析器 五.响应器 一.视图层封装 1.基本视图 写一个出版社的增删改查resfull接口 路由: url(r'^publish/$', ...
- django url分发,视图,模板回顾
Django基础轮廓 MTV+controller 一 url分发系统: 1 简单使用 url(r'^articles/2003/$', views.special_case_2003), # spe ...
- 第二章:视图层 - 1:URL路由基础
路由的编写方式是Django2.0和1.11最大的区别所在.Django官方迫于压力和同行的影响,不得不将原来的正则匹配表达式,改为更加简单的path表达式,但依然通过re_path()方法保持对1. ...
- Django 的路由层 视图层 模板层
--------------------------------------------------------------通过苦难,走向欢乐.——贝多芬 Django-2的路由层(URLconf) ...
- Django--路由层、视图层、模版层
路由层: 路由匹配 url(正则表达式,视图函数内存地址) 只要正则匹配到了内容,就不再往下匹配,而是直接运行后面的视图函数 匹配首页) url(r'^&', home) 匹配尾页 url(r ...
- Django - - - -视图层之视图函数(views)
视图层之视图函数(views) 一个视图函数,简称视图,是一个简单的Python 函数,它接受Web请求并且返回Web响应.响应可以是一张网页的HTML内容,一个重定向,一个404错误,一个XML文档 ...
- 【Django】 视图层说明
[Django视图层] 视图层的主要工作是衔接HTTP请求,Python程序和HTML模板,使他们能够有机互相合作从模型层lou到数据并且反馈.说到视图层的工作就有以下几个方面要说 ■ URL映射 对 ...
- DjangoRestFramework学习三之认证组件、权限组件、频率组件、url注册器、响应器、分页组件
DjangoRestFramework学习三之认证组件.权限组件.频率组件.url注册器.响应器.分页组件 本节目录 一 认证组件 二 权限组件 三 频率组件 四 URL注册器 五 响应器 六 分 ...
随机推荐
- 该死的端口占用!教你用 Shell 脚本一键干掉它!
1. 前言 大家好,我是安果! 在 Web 开发中,经常会遇到「端口被占用」的场景 常规解决方案是: 使用 lsof -i 命令查询占用端口的进程 PID 利用 kill -9 PID 干掉目标进程 ...
- ES6学习笔记(3)- 对象的功能性扩展
一.什么是对象字面量 对象字面量就是创建对象(Object)的一种简单容易理解的方式,再通俗点就是所谓的键值对的集合.举个简单的例子: let book = { name: 'JavaScript', ...
- python torndb模块
一.torndb概述 torndb是一个轻量级的基于MySQLdb封装的一个模块,其是tornado框架的一部分.其项目主页为:https://github.com/bdarnell/torndb . ...
- Bi-shoe and Phi-shoe LightOJ - 1370(数论+素数筛)
题目链接:https://vjudge.net/problem/LightOJ-1370 题意:给你N个欧拉函数值,找出每一个大于等于该欧拉函数值的数,并且要求相加和最小. 题解:因为素数i的欧拉函数 ...
- 【体系结构】Oracle进程架构
Client Process的介绍 Client and Server Processes Client Process代表着客户端进程,每一个客户端进程关联着一个Server Process(服务器 ...
- Go语言中使用K8s API及一些常用API整理
Go Client 在进入代码之前,理解k8s的go client项目是对我们又帮助的.它是k8s client中最古老的一个,因此具有很多特性. Client-go 没有使用Swagger生成器,就 ...
- ubuntu修改默认启动内核
一.序言 新换的笔记本由于太新的主板芯片,驱动还没有完善.每次升级系统内核都要小心谨慎.经常发生部分硬件驱动失败的事情.系统Ubuntu 20.04.2 LTS x86_64 ,我现在使用的两个版本的 ...
- Hibernate&MyBatis
ORM程序技术 概念:ORM是对象(Object).关系(Relational).映射(Mapping)的缩写. 作用:用于替代JDBC 用法:数据库类名与表名对应:字段名和属性名对应: 优势: 更方 ...
- 如何使用Topshelf与.NET泛型主机建立Windows服务
1 前置阅读 在阅读本文章之前,你可以先阅读: Topshelf一个用于使用.NET构建Windows服务框架 2 使用 2.1 创建应用程序 首先,创建一个新的控制台应用程序并从nuget获取Top ...
- 【PHP】用了这么久的Laravel框架,你分析过核心架构了没
Laravel最初的设计是为了面向MVC架构的,它可以满足如事件处理.用户身份验证等各种需求.另外它还有一个由管理数据库强力支持,用于管理模块化和可扩展性代码的软件包管理器. Laravel以其简洁. ...