一.路由配置系统
1.1 基本认识
a. URL配置(URLconf)就像Django 所支撑网站的目录。它的本质是URL与要为该URL调用的视图函数之间的映射表
b. URLconf 在请求的URL 上查找,将它当做一个普通的Python 字符串。不包括GET和POST参数以及域名。
例如,http://www.example.com/myapp/ 请求中,URLconf 将查找myapp/
。
在http://www.example.com/myapp/?page=3 请求中,URLconf 仍将查找myapp/
。
URLconf 不检查请求的方法。换句话讲,所有的请求方法 —— 同一个URL的POST
、GET
、HEAD
等等 —— 都将路由到相同的函数。
c. 每个捕获的参数都作为一个普通的Python 字符串传递给视图,无论正则表达式使用的是什么匹配方式。
1.2 语法
urlpatterns = [
url(正则表达式, views视图函数,参数,别名)
1.3 基本用法
from django.conf.urls import url,include from django.contrib import admin from app01 import views urlpatterns = [ url(r'^admin/', admin.site.urls), #不加$,匹配开头 url(r'^login/$', views.login), #加$,完整匹配
#加括号,将作为位置参数传入view函数里 url(r'^articles/([0-9]{4})/$', views.year_archive),
url(r'^menu/(d+)', views.menu), # menu(request,1)
''' 有名分组(named group) 将用"()"捕获的URL中的值以关键字参数传入view函数中 在Python 正则表达式中,命名正则表达式组的语法是(?P<name>pattern),其中name 是组的名称,pattern 是要匹配的模式。 ''' from django.conf.urls import url from . import views urlpatterns = [ url(r'^articles/2003/$', views.special_case_2003), url(r'^articles/(?P<year>[0-9]{4})/$', views.year_archive), url(r'^articles/(?P<year>[0-9]{4})/(?P<month>[0-9]{2})/$', views.month_archive), url(r'^articles/(?P<year>[0-9]{4})/(?P<month>[0-9]{2})/(?P<day>[0-9]{2})/$', views.article_detail), ]
''' 利用有名分组,给view参数设默认值 ''' from django.conf.urls import url from . import views urlpatterns = [ url(r'^blog/$', views.page), url(r'^blog/page(?P<num>[0-9]+)/$', views.page), ]
1.4 URL分发
''' 当有多个app,且url路径较多时,为方便管理,可进行url分发 在app目录中建立自己的urls,在共享urls文件中利用‘include’实现 ''' from django.conf.urls import include, url urlpatterns = [ url(r'^admin/', admin.site.urls), url(r'^blog/', include('blog.urls')), ]
另一种分发:
url的第二个参数也可以直接进行分发,语法:
url(r'xxx',([url(r'yyy',views)],None,None))
urlpatterns = [ url(r'^admin/', admin.site.urls), url(r'^stark/', ([ url(r'app01/userinfo/', ([ url(r'add', add), url(r'delete', delete), ], None, None)), url(r'app01/book/', ([ url(r'add', add) ], None, None)) ], None, None))
1.5 URL反向解析
在使用Django 项目时,一个常见的需求是获得URL 的最终形式,以用于嵌入到生成的内容中(视图中和显示给用户的URL等)或者用于处理服务器端的导航(重定向等)。
人们强烈希望不要硬编码这些URL(费力、不可扩展且容易产生错误)或者设计一种与URLconf 毫不相关的专门的URL 生成机制,因为这样容易导致一定程度上产生过期的URL。
换句话讲,需要的是一个DRY 机制。除了其它有点,它还允许设计的URL 可以自动更新而不用遍历项目的源代码来搜索并替换过期的URL。
获取一个URL 最开始想到的信息是处理它视图的标识(例如名字),查找正确的URL 的其它必要的信息有视图参数的类型(位置参数、关键字参数)和值。
Django 提供一个办法是让URL 映射是URL 设计唯一的地方。你填充你的URLconf,然后可以双向使用它:
- 根据用户/浏览器发起的URL 请求,它调用正确的Django 视图,并从URL 中提取它的参数需要的值。
- 根据Django 视图的标识和将要传递给它的参数的值,获取与之关联的URL。
第一种方式是我们在前面的章节中一直讨论的用法。第二种方式叫做反向解析URL、反向URL 匹配、反向URL 查询或者简单的URL 反查。
在需要URL 的地方,对于不同层级,Django 提供不同的工具用于URL 反查:
- 在模板中:使用url 模板标签。
- 在Python 代码中:使用
django.core.urlresolvers.reverse()
函数。 - 在更高层的与处理Django 模型实例相关的代码中:使用
get_absolute_url()
方法
#urls中 from django.conf.urls import url,include from django.contrib import admin from app01 import views urlpatterns = [ url(r'^admin/', admin.site.urls), url(r'^loginggggg/$', views.login,name='login'), #templates中 <form action="{% url 'login' %}" method="post">
1.6 名称空间(namespace)
二.视图函数(views)
2.1 介绍
接受web请求并进行逻辑处理继而返回web响应。
约定是将视图放置在项目或应用程序目录中的名为views.py的文件中。
2.2 请求对象
request作为views函数中的第一个参数使用
Request.body ''' 一个字符串,代表请求报文的主体。在处理非 HTTP 形式的报文时非常有用,例如:二进制图片、XML,Json等。 但是,如果要处理表单数据的时候,推荐还是使用 HttpRequest.POST 。 另外,我们还可以用 python 的类文件方法去操作它,详情参考 HttpRequest.read() 。 ''' Request.path ''' 一个字符串,表示请求的路径组件(不含域名)。 例如:"/music/bands/the_beatles/" ''' Request.method ''' 一个字符串,表示请求使用的HTTP 方法。必须使用大写。 例如:"GET"、"POST" ''' Request.GET ''' 一个类似于字典的对象,包含 HTTP GET 的所有参数。详情请参考 QueryDict 对象。 ''' Request.POST ''' 一个类似于字典的对象,如果请求中包含表单数据,则将这些数据封装成 QueryDict 对象。 POST 请求可以带有空的 POST 字典 —— 如果通过 HTTP POST 方法发送一个表单,但是表单中没有任何的数据,QueryDict 对象依然会被创建。 因此,不应该使用 if request.POST 来检查使用的是否是POST 方法;应该使用 if request.method == "POST" 另外:如果使用 POST 上传文件的话,文件信息将包含在 FILES 属性中。 ''' Request.META ''' 一个标准的Python 字典,包含所有的HTTP 首部。具体的头部信息取决于客户端和服务器,下面是一些示例: CONTENT_LENGTH —— 请求的正文的长度(是一个字符串)。 CONTENT_TYPE —— 请求的正文的MIME 类型。 HTTP_ACCEPT —— 响应可接收的Content-Type。 HTTP_ACCEPT_ENCODING —— 响应可接收的编码。 HTTP_ACCEPT_LANGUAGE —— 响应可接收的语言。 HTTP_HOST —— 客服端发送的HTTP Host 头部。 HTTP_REFERER —— Referring 页面。 HTTP_USER_AGENT —— 客户端的user-agent 字符串。 QUERY_STRING —— 单个字符串形式的查询字符串(未解析过的形式)。 REMOTE_ADDR —— 客户端的IP 地址。 REMOTE_HOST —— 客户端的主机名。 REMOTE_USER —— 服务器认证后的用户。 REQUEST_METHOD —— 一个字符串,例如"GET" 或"POST"。 SERVER_NAME —— 服务器的主机名。 SERVER_PORT —— 服务器的端口(是一个字符串)。 从上面可以看到,除 CONTENT_LENGTH 和 CONTENT_TYPE 之外,请求中的任何 HTTP 首部转换为 META 的键时, 都会将所有字母大写并将连接符替换为下划线最后加上 HTTP_ 前缀。 所以,一个叫做 X-Bender 的头部将转换成 META 中的 HTTP_X_BENDER 键。 '''
2.3 render
结合一个给定的模板和一个给定的上下文字典,并返回一个渲染后的 HttpResponse 对象。
render(request, template_name,{})
template_name:模板名称
{}:可选,对html文件进行渲染。具体见Django之templetes
return render(request,'dep_change.html',{'dep_init_name':dep_init_name})
return render(request,'dep_change.html',locals()) #不需一个一个传值
2.4 redirect
重定向。参数为一个url地址。