文章目录
路由层(URLconf)
路由层简单配置
URL配置(URLconf)就像Django 所支撑网站的目录。它的本质是URL与要为该URL调用的视图函数之间的映射表;你就是以这种方式告诉Django,对于客户端发来的某个URL调用哪一段逻辑代码对应执行。
Django2 用path
Django1用url
path方法
写固定的url.
注意后面必须有/
,
浏览器输入url:
re_path方法
可以使用正则规则
urlpatterns = [
path('admin/', admin.site.urls),
path('articles/2003/', views.special_case_2003),
re_path(r'^articles/(?P<year>[0-9]{4})/$', views.year_archive),
re_path(r'^articles/(?P<year>[0-9]{4})/(?P<month>[0-9]{2})/$', views.month_archive),
re_path(r'^articles/(?P<year>[0-9]{4})/(?P<month>[0-9]{2})/(?P<day>[0-9]+)/$', views.article_detail),
]
-
path和url的区别:
-
path
内部封装好了,自动限制首尾的规则 -
url
没有封装,需要自己手动添加正则规则(同re_path
方法).
注意:
- 若要从URL 中捕获一个值,只需要在它周围放置一对圆括号。
- 不需要添加一个前导的反斜杠,因为每个URL 都有。例如,应该是
^articles
而不是^/articles
。 - 每个正则表达式前面的
r
是可选的但是建议加上。它告诉Python 这个字符串是“原始的” —— 字符串中任何字符都不应该转义
无名分组(按位置传参)
用re_path
方法,在url里用小括号进行分组(括号里写上正则的规则).
注意:在视图函数里要写上对应的形参,否则会报错.
有名分组(按关键字传参)
用re_path方法,在url里用小括号进行分组(括号里写上正则的规则).
语法:括号里(?P<关键字名称>正则规则)
在视图里形参必须要跟关键字名称保持一致,位置没有关系.
反向解析
在使用Django 项目时,一个常见的需求是获得URL 的最终形式,以用于嵌入到生成的内容中(视图中和显示给用户的URL等)或者用于处理服务器端的导航(重定向等)。人们强烈希望不要硬编码这些URL(费力、不可扩展且容易产生错误)或者设计一种与URLconf 毫不相关的专门的URL 生成机制,因为这样容易导致一定程度上产生过期的URL。
好处: 当你url发生改变,动态反向解析出对应的url.便于开发和维护.
使用的步骤:
-
urls.py
定义namepath('login1/', views.login, name="login"),
-
在
views.py
视图中反向解析from django.urls import reverse reverse("login") #无名分组 #re_path(r'^login1/([0-9]{2})/$', views.login, name="login"), reverse("login", args=("12",)) #有名分组 #re_path(r'^login1/(?P<month>[0-9]{2})/$', views.login, name="login"), reverse("login", kwargs={"month": "12"})
-
在模板
login.html
中使用反向解析path方法(url) <form action="{% url 'login' %}" method="post"> re_path(无名分组) <form action="{% url 'login' 12 %}" method="post"> re_path(有名分组) <form action="{% url 'login' month=12 %}" method="post">
名称空间
命名空间(英语:Namespace)是表示标识符的可见范围。一个标识符可在多个命名空间中定义,它在不同命名空间中的含义是互不相干的。这样,在一个新的命名空间中可定义任何标识符,它们不会与任何已有的标识符发生冲突,因为已有的定义都处于其它命名空间中。
我们在开发项目时,会经常使用name
属性反解出URL,当不小心在不同的app的urls中定义相同的name
时,可能会导致URL反解错误,为了避免这种事情发生,引入了命名空间。
-
定义名称空间
project的urls.py
path('app01/', include(("app01.urls", "app01"))), path('app02/', include(("app02.urls", "app02"))), # 在conf.py源码的44行 # namespace = namespace or app_name
-
使用名称空间
app01.urls
urlpatterns = [ re_path(r'^index/', index,name="index"), ]
app02.urls
urlpatterns = [ re_path(r'^index/', index,name="index"), ]
app01.views
from django.core.urlresolvers import reverse def index(request): return HttpResponse(reverse("app01:index"))
app02.views
from django.core.urlresolvers import reverse def index(request): return HttpResponse(reverse("app02:index"))
在模板中也是同理
<form action="{% url 'app01:Login' %}" method="post"> <p>用户名:<input type="text" name="user"></p> <p>密码:<input type="password" name="pwd"></p> <input type="submit"> </form>
视图层
一个视图函数,简称视图,是一个简单的Python 函数,它接受Web请求并且返回Web响应。为了将代码放在某处,约定是将视图放置在项目或应用程序目录中的名为views.py
的文件中。
视图层,熟练掌握两个对象即可:请求对象(request)和响应对象(HttpResponse):
HttpRequest对象
request属性
django将请求报文中的请求行、首部信息、内容主体封装成 HttpRequest 类中的属性。
-
HttpRequest.GET
一个类似于字典的对象,包含 HTTP GET 的所有参数。GET QueryDict 响应头的内容(url后的参数)- 获取一个值
request.GET.get("name")
# 参数同名时返回最后一个 - 获取多个值
request .GET.getlist("name")
# 返回值为list
- 获取一个值
-
HttpRequest.POST
一个类似于字典的对象,如果请求中包含表单数据,则将这些数据封装成 QueryDict 对象。POST QueryDict 响应体里的内容。注意:键值对的值是多个的时候,比如checkbox类型的input标签,select标签,需要用:
request.POST.getlist("hobby")
-
HttpRequest.body
原生请求体的内容:一个字符串,代表请求报文的主体。在处理非 HTTP 形式的报文时非常有用,例如:二进制图片、XML,Json等。
但是,如果要处理表单数据的时候,推荐还是使用HttpRequest.POST
。 -
HttpRequest.path
返回当前请求的路径(url)(不含域名)例:"/music/bands/the_beatles/"
-
HttpRequest.method
返回当前请求的请求方式:一个字符串,表示请求使用的HTTP 方法。必须使用大写。例如:“GET”、“POST”
request常用方法
-
HttpRequest.get_full_path()
获取当前请求的完整路径(包含参数,不包含锚点)例如:"/music/bands/the_beatles/?print=true"
-
HttpRequest.is_ajax()
如果请求是通过XMLHttpRequest 发起的,则返回True,方法是检查 HTTP_X_REQUESTED_WITH 相应的首部是否是字符串’XMLHttpRequest’。
判断当前请求是否是ajax请求.返回值为布尔值
HTTPResponse对象(响应三剑客)
-
响应对象主要有三种形式(响应三剑客):
-
HttpResponse()
-
render()
-
redirect()
-
HTTPResponse
直接返回字符串,响应体里面的内容 -
render
render(request, template_name[, context])
结合一个给定的模板和一个给定的上下文字典,并返回一个渲染后的 HttpResponse 对象(模板文件)
第一个参数 request
第二个参数 模板文件(login.html)
第三个参数(可选) 模板需要渲染的值. -
redirect
重定向def my_view(request): ... return redirect('/some/url/')
也可以是一个完整的URL
def my_view(request): ... return redirect('http://example.com/')