Django-基础函数
Django 基础函数篇
一、视图函数
1.定义
- 通过URL对应关系匹配 ->找到对应的函数(或者类)->返回字符串(或者读取Html之后返回渲染的字符串)。这里RUL对应的函数,我们就叫视图函数。
- 视图函数是一个简单的Python 函数,它接受Web请求并且返回Web响应。响应可以是一张网页的HTML内容,一个重定向,一个404错误,一个XML文档,或者一张图片. . . 是任何东西都可以。无论视图本身包含什么逻辑,都要返回响应。这个视图函数代码一般约定是放置在项目或应用程序目录中的名为views.py的文件中。
http请求中产生两个核心对象:
1、http请求---->HttpRequest对象,用户请求相关的所有信息(对象)
2、http响应---->HttpResponse对象,响应字符串****
例子:
新建views1.py
from django.http import HttpResponse
def index(request):
return HttpResponse("你好")
在urls.py中修改配置
from . import views1
path('', views1.index, name='index'),
- 例子里,我们用到的request,就是HttpRequest对象。HttpResponse(“你好”),就是HttpResponse对象,它向http请求响应了一段字符串。
- 视图函数,就是围绕着HttpRequest和HttpResponse这两个对象进行的。
2.HttpRequest对象,request请求信息和属性和方法
属性和方法包含下面几个:
- request.path:这个主要是用来获取访问文件路径
from django.shortcuts import render,HttpResponse
def index(request):
print(request.path)
print(request.get_full_path())
return render(request,'index.html')
如果我们是通过http://127.0.0.1:8000/post/23?page=1请求的话。
request.path的结果为:/post/23
request.get_full_path()的结果为:/post/23?page=1
- request.method属性:获取请求中使用的HTTP方式(POST/GET)
from django.shortcuts import render,HttpResponse
def index(request):
print(request.method)
return render(request,'index.html')
- request.body属性:含所有请求体信息 是bytes类型
- request.GET,获取HTTP GET方式请求传参,的参数(字典类型)
from django.shortcuts import render,HttpResponse
def index(request):
print(request.GET)
return render(request,'index.html')
如果我们通过http://127.0.0.1:8000/post/?fenlei=123 & page=3 请求。
获取到:<QueryDict: {’ page’: [‘456’], ‘fenlei’: ['123 ']}>
3.HttpResponse响应对象方法和属性
对于HttpRequest请求对象来说,是由django自动创建的,但是,HttpResponse响应对象就必须我们自己> 创建。每个view请求处理方法必须返回一个HttpResponse响应对象。HttpResponse类在
django.http.HttpResponse。
HttpResponse对象的常用方法:
- render函数。将指定页面渲染后返回给浏览器。
render(request, template_name[, context])
结合一个给定的模板和一个给定的上下文字典,并返回一个渲染后的HttpResponse对象。
def index(request):
blog_index = models.Article.objects.all().order_by('-id')
print(request.body)
context = {
'blog_index':blog_index,
}
return render(request, 'index.html',context)
参数:
- request: 用于生成响应的请求对象。
- template_name:要使用的模板的完整名称,可选的参数
- context:添加到模板上下文的一个字典。默认是一个空字典。如果字典中的某个值是可调用的,视图将在渲染模板之前调用它。
- content_type:生成的文档要使用的MIME类型。默认为DEFAULT_CONTENT_TYPE 设置的值。
- status:响应的状态码。默认为200。
- render方法主要是将从服务器提取的数据,填充到模板中,然后将渲染后的html静态文件返回给浏览器。这里一定要注意:render渲染的是模板。
结合我们MVC与MTV开发模式里博客开发的例子,我们的模板是这样写的:
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>博客首页</title>
</head>
<body>
<div style="margin: 0 auto">
<ul>
<h3>最新文章</h3>
{% for x in blog_index %}
<li>{{ x.title }}</li>
{% endfor %}
</ul>
</div>
</body>
</html>
上面 {% for x in blog_index %}到{% endfor %}之间包括的就是我们要从数据库取出的数据,进行填充。
对于这样一个没有填充数据的html文件,浏览器是不能进行渲染的,所以,对于上述{% for x in
blog_index %}到{% endfor %}之间的内容先要被render进行渲染之后,才能发送给浏览器。
Views里是这样写的:
def index(request):
blog_index = models.Article.objects.all().order_by('-id')#从数据库中取出文章数据
print(request.body)
context = {
'blog_index':blog_index,#将数据保存在blog_index
}
return render(request, 'index.html',context)#通过render进行模板渲染
- redirect函数,多用于页面跳转。
-
redirect的参数可以是:
一个模型:将调用模型的get_absolute_url() 函数
一个视图,可以带有参数:将使用urlresolvers.reverse 来反向解析名称
一个绝对的或相对的URL,将原封不动的作为重定向的位置。 -
默认返回一个临时的重定向;传递permanent=True 可以返回一个永久的重定向。
示例:
### 传递一个对象,将调用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('https://www.django.cn/')
### 默认情况下,redirect() 返回一个临时重定向。以上所有的形式都接收一个permanent 参数;如果设置为True,将返回一个永久的重定向:
def my_view(request):
...
object = MyModel.objects.get(...)
return redirect(object, permanent=True)
render和redirect两者区别:
- 假如render返回一个登陆成功后的页面,刷新该页面将回复到跳转前页面。而redirect则不会
- 如果页面需要模板语言渲染,需要的将数据库的数据加载到html,那么render方法则不会显示这一部分,render返回一个登陆成功页面,不会经过url路由分发系统,也就是说,不会执行跳转后url的视图函数。这样,返回的页面渲染不成功;而redirect是跳转到指定页面,当登陆成功后,会在url路由系统进行匹配,如果有存在的映射函数,就会执行对应的映射函数。