URL配置(URLconf)就像Django 所支撑网站的目录。它的本质是URL与要为该URL调用的视图函数之间的映射表;你就是以这种方式告诉Django,对于这个URL调用这段代码,对于那个URL调用那段代码。
urlpatterns = [
url(正则表达式, views视图函数,参数,别名),
]
参数说明:
一个正则表达式字符串
一个可调用对象,通常为一个视图函数或一个指定视图函数路径的字符串
可选的要传递给视图函数的默认参数(字典形式)
一个可选的name参数
视图层之视图函数(views)
一个视图函数,简称视图,是一个简单的Python 函数,它接受Web请求并且返回Web响应。响应可以是一张网页的HTML内容,一个重定向,一个404错误,一个XML文档,或者一张图片. . . 是任何东西都可以。无论视图本身包含什么逻辑,都要返回响应。代码写在哪里也无所谓,只要它在你的Python目录下面。除此之外没有更多的要求了——可以说“没有什么神奇的地方”。为了将代码放在某处,约定是将视图放置在项目或应用程序目录中的名为views.py的文件中。
一个简单的视图
下面是一个返回当前日期和时间作为HTML文档的视图:
from django.http import HttpResponse
import datetime
def current_datetime(request):
now = datetime.datetime.now()
html = "<html><body>It is now %s.</body></html>
让我们逐行阅读上面的代码:
• 首先,我们从 django.http模块导入了HttpResponse类,以及Python的datetime库。
• 接着,我们定义了current_datetime函数。它就是视图函数。每个视图函数都使用HttpRequest对象作为第一个参数,并且 通常称之为request。注意,视图函数的名称并不重要;不需要用一个统一的命名方式来命名,以便让Django识别它。我们 将其命名为current_datetime,是因为这个名称能够精确地反映出它的功能。
• 这个视图会返回一个HttpResponse对象,其中包含生成的响应。每个视图函数都负责返回一个HttpResponse对象。
HttpResponse参数:
path |
请求页面的全路径,不包括域名 |
method |
请求中使用的HTTP方法的字符串表示。全大写表示。例如 if req.method=="GET": do_something() elif req.method=="POST": do_something_else() |
GET |
包含所有HTTP GET参数的类字典对象 |
POST |
包含所有HTTP POST参数的类字典对象 |
COOKIES |
包含所有cookies的标准Python字典对象;keys和values都是字符串。 |
FILES |
包含所有上传文件的类字典对象;FILES中的每一个Key都是<input type="file" name="" />标签中 |
user |
是一个django.contrib.auth.models.User对象,代表当前登陆的用户。如果访问用户当前没有登陆,user将被初始化为django.contrib.auth.models.AnonymousUser的实例。你可以通过user的is_authenticated()方法来辨别用户是否登陆:if req.user.is_authenticated();只有激活Django中的AuthenticationMiddleware时该属性才可用 |
session |
唯一可读写的属性,代表当前会话的字典对象;自己有激活Django中的session支持时该属性才可用。 |
方法:
get_full_path()
注意:键值对的值是多个的时候,比如checkbox类型的input标签,select标签,需要用:
request.POST.getlist("hobby"), 当有多选框时,直接用get只能得到最后一个值,必须要用getlist才能取全部值。
render(request, template_name[, context])
结合一个给定的模板和一个给定的上下文字典,并返回一个渲染后的 HttpResponse 对象。
参数:
request: 用于生成响应的请求对象。
template_name:要使用的模板的完整名称,可选的参数
context:添加到模板上下文的一个字典。默认是一个空字典。如果字典中的某个值是可调用的,视图将在渲染模板之前调用它。
content_type:生成的文档要使用的MIME类型。默认为DEFAULT_CONTENT_TYPE 设置的值。
status:响应的状态码。默认为200。
redirect 函数
参数:
一个模型:将调用模型的get_absolute_url() 函数
一个视图,可以带有参数:将使用urlresolvers.reverse 来反向解析名称
一个绝对的或相对的URL,将原封不动的作为重定向的位置。
默认返回一个临时的重定向;传递permanent=True 可以返回一个永久的重定向。
当传入视图函数时,它通过调用urlresolvers.reverse反向解析出url。
所以下面的写法是等价的:
redirect('accout:login') === redirect(reverse('account:login'))
你可以用多种方式使用redirect() 函数。
传递一个对象
将调用get_absolute_url() 方法来获取重定向的URL:
from django.shortcuts import redirect
def my_view(request):
...
object = MyModel.objects.get(...)
return redirect(object)
传递一个视图的名称
可以带有位置参数和关键字参数;将使用reverse() 方法反向解析URL:
def my_view(request):
...
return redirect('some-view-name', foo='bar')
传递要重定向的一个硬编码的URL
def my_view(request):
...
return redirect('/some/url/')
也可以是一个完整的URL:
def my_view(request):
...
return redirect('http://example.com/')
默认情况下,redirect() 返回一个临时重定向。以上所有的形式都接收一个permanent 参数;如果设置为True,将返回一个永久的重定向:
def my_view(request):
...
object = MyModel.objects.get(...)
return redirect(object, permanent=True)
注意:render和redirect的区别:
1、 if 页面需要模板语言渲染,需要的将数据库的数据加载到html,那么render方法则不会显示这一部分。
2、 the most important: url没有跳转到/yuan_back/,而是还在/login/,所以当刷新后又得重新登录。
render与redirect的本质区别
上面为render,下面为redirect
django 视图分为FBV,CBV两种模式。
FBV 是 function based view的简写, CBV是 class based view的简写。分别 是用函数写的视图函数,类写的视图函数。
使用装饰器装饰FBV, FBV本身就是一个函数,所以和给变通的函数加装饰器无差别。
def wrapper(func):
def inner(*args, **kwargs):
start_time = time.time()
ret = func(*args, **kwargs)
end_time = time.time()
print("used:", end_time-start_time)
return ret
return inner
@wrapper
def add_class(request):
if request.method == 'POST':
class_name = request.POST.get('class_name')
models.classes.objects.create(name=class_name)
return redirect('/class_list/')
return render(request, 'add_class.html')
使用装饰器装饰CBV
类中的方法与独立函数不完全相同,因此不能直接将函数应用于类中的方法,我们需要先将其转换为方法装饰器。Django中提供了method_decorator装饰器用于将函数装饰器转换为方法装饰器。
from django.views import view
from django.utils.decorators import method_decorator
class AddClass(view):
@method_decorator(wrapper)
def get(self, request):
return render(request, 'add_class.html')
def post(self, request):
class_name = request.POST.get('class_name')
models.classes.objects.create(name=class_name)
return redirect('/class_list/')
request对象
当一个页面被请求时,Django会创建一个包含本次请求信息(请求报文中的请求行,首部信息,内容主体)的HttpRequest对象,Django会将这个对象自动传递给响应的视图函数,一般视图函数约定俗成地使用request这个参数承接这个对象。
请求相关的常用值:可以通过request.属性名 得到。
- path_info 返回用户访问的url, 不包括域名
- method 请求中使用的http请求方法的字符串表示,大写表示
- GET 包含http GET参数的类字典对象
- POST 包含http POST参数的类字典对象
- body 请求体,byte类型,request.POST的数据就是从body中提取的。
- scheme 请求的方案如http, https等
- encoding 编码方式,值为字符串,如果为None则表明使用网页中的DEFAULT_CHARSET的设置,默认为utf-8
- COOKIES python字典格式,包含所有的cokie, 键值都为字符串
- FILES 类似字典的对象,包含所有的上传文件信息, FILES只有在请求的方法为POST且提交的<form>带有enctype="multipart/form-data"的情况下都会包含数据,否则,FILES为一个空的类字典对象。
- 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 键。
- user 一个AUTH_USER_MODEL类型的对象,表示当前登陆的用户。如果用户没有登陆,user将设置为django.contrib.auth.models.AnonymousUser的一个实例,可以通过is_authenticated()区分它们。
关于匿名用户:class models.AnonymousUser
django.contrib.auth.models.AnonymousUser类实现了django.contrib.auth.models.User接口,但有些不同。
id 永远为None
username 永远为空字符串
get_username()返回空字符串
is_staff和is_superuser 为False
is_active为False
groups ,user_permissions为空
is_anonymous() 返回为True
is_authenticated() 返回False
- session 一个可读又可写的类似字典的对象,表示当前的会话,只有当django启用会话的支持时才可用。
response对象
我们创建的每个视图函数view都需要返回一个HttpResponse, HttpResponse 位于django.http模块中。
属性:
HttpResponse.content 响应内容
HttpResponse.charset 响应内容的编码
Httpresponse.status_code 响应的状态码
Django shortcut functions
render, 通常情况下需要三个参数(request, 'template_name.html', context), 它的作用是将context上下文传给指定的模板文件,渲染成一个Httpresponse对象。
redirect, 它的参数可以是一个模型(将会调用模型的get_absolute_url()方法),一个视图(调用urlresolvers.reverse来反向解析出url),一个绝对的或者相对的url(保持这个url,然后重定向到它),默认返回一个收临时重定向,当参数为permanent=True则返回一个永久的重定向。