Функция просмотра Django отвечает на «Три мушкетера»

Python Django

Это 6-й день моего участия в ноябрьском испытании обновлений.Подробности о событии:Вызов последнего обновления 2021 г.

Views Django часто использует ответ HTTP (), Render () и Redirect (), чтобы ответить на запросы. Они называются «три мушкетера» просмотра функций.

Функция HTTPResponse()

функция рендеринга()

Функция render() предоставляется модулем django.shortcuts.Его функция состоит в том, чтобы генерировать объект Http Response и возвращать его на основе файла шаблона и переменной типа словаря, переданной в файл шаблона.

Формат функции

render(request, template_name, context=None,content_type=None, status=None)
  • request: позиционный параметр, представляющий веб-запрос, переданный в функцию представления, инкапсулирующий все данные в заголовке запроса, который на самом деле является запросом параметра представления.

  • Template_name: список позиций должен быть выбран, относится к имени файла шаблона для использования, который, как правило, файл HTML в каталоге шаблонов.

  • контекст: необязательный параметр, данные относятся к типу словаря, по умолчанию используется пустой словарь, который сохраняет переменные для передачи в файл HTML.

  • content_type: необязательный именованный параметр для установки типа MIME (многоцелевого расширения почты Интернета) создаваемого документа. По умолчанию используется значение DEFAULT_CONTENT_TYPE text/html.

  • status: необязательный параметр, указывающий код состояния ответа, по умолчанию 200.

    пример:

    from django.shortcuts import renderdef test_view(request):
    # 视图的代码写在这里
    def xxx(request):
    	xxxxxxx
    	return render(request, 'index.html', {'welcome': 'hello world!'} ,content_type='text/html')
    
    # 传递变量名为welcome值为'hello world!'的变量
    

функция перенаправления()

Функция redirect() получает параметр, сообщающий браузеру о перенаправлении на указанный URL-адрес; этот параметр может быть объектом модели данных (Model), именем функции представления или URL-адресом.

Когда параметр является объектом модели данных (Model)

Функция Redirect () позвонит функцию get_absolute_url (), определенной в модели данных, получите значение URL, возвращенное функцией, а затем перейти к URL.

пример

URL. Друзья:

.....
path('dep/<int:dep_id>/',views.depdetail,name='depdetail'),
path('test_redirect/',views.test_redirect),
....

models.py:

#导入数据模块
from django.db import models
# 导入反向解析函数
from django.urls import reverse
# 部门数据模型(部门数据表)
class department(models.Model):
    # 部门名称,为字符类型
    dep_name=models.Char Field(max_length=32,verbose_name='部门名称',unique=True, blank=False)
    # 部门备注说明
    dep_script=models.Char Field(max_length=60,verbose_name='备注',null=True)
    # 数据模型的get_absolute_url()方法
    def get_absolute_url(self):
# 反向解析URL,解析成/dep/ self.pk /
		return reverse('depdetail',kwargs={'dep_id':self.pk})
# 在数据模型department中定义了一个函数get_absolute_url(),该函数返回一个URL。

reverse() — это функция обратного синтаксического анализа URL-адресов, значение ее первого параметра — «depdetail», который представляет собой элемент конфигурации URL-адреса с именем depdetail. Процесс синтаксического анализа реверса: найдите элемент конфигурации с именем depdetail в urls.py в текущем приложении test_view, функция reverse() найдет соответствующий URL-адрес в соответствии с переданным ей параметром типа словаря (kwargs={'dep_id' :self.pk}) для объединения и, наконец, анализа для создания полного URL-адреса.

views.py:

from django.shortcuts 
import render,Http Response,redirect
from . import models
def depdetail(request,dep_id):
    # 根据传入的参数值取出一条记录
    obj=models.department.objects.get(id=dep_id)
    # 返回Http Response对象
    return Http Response('部门:'+obj.dep_name+',备注:'+obj.dep_script)
def test_redirect(request):
    obj=models.department.objects.get(id=1)
    # 用redirect()重定向,参数是数据模型对象,所以重定向到数据模型get_absolute_url生成的URL
    # 这个URL对应视图函数views.depdetail(),实际上调用这个函数
    return redirect(obj)

В функции представления test_redirect() есть функция redirect().Здесь функция redirect() разделена на следующие три шага.

  • Поскольку параметр obj, переданный в функцию redirect(), является объектом экземпляра модели данных (записью данных), а классом модели данных этого объекта является отдел, вызывается метод объекта get_absolute_url().
  • Имя элемента конфигурации функции get_absolute_url () и имя элемента url obj beverform ()).
  • После того, как функция reverse() получает URL-адрес, она обращается к файлу urls.py, чтобы найти соответствующую связь, обнаруживает, что соответствующей функцией просмотра является depdetail(), и, наконец, выполняет эту функцию.

Когда параметр является именем функции просмотра

Функция redirect() обратно анализирует URL-адрес с помощью имени функции просмотра и параметров функции просмотра и перенаправляет на этот URL-адрес. Следующий код передает имя функции представления depdetail и параметры

def test_redirect(request):
# 视图函数depdetail()有参数dep_id
	return redirect('depdetail',dep_id=2)

Процесс выполнения функции redirect() здесь заключается в том, чтобы сначала проанализировать URL-адрес в обратном порядке, найти функцию просмотра, соответствующую URL-адресу в файле urls.py, и выполнить функцию просмотра depdetail(). Со стороны можно понять, что функция просмотра depdetail() вызывается напрямую через redirect().

Когда параметр является полным URL

Функция redirect() напрямую открывает веб-страницу, на которую указывает этот URL. параметры имеютhttp:// — это префикс, это полный URL-адрес, например: return redirect('http://127.0.0.1:8000/dep/2/') и вернуться redirect('http://url/').

Параметр - это URL

но безКогда http:// и https://, функция redirect() будет искать совпадение в файле urls.py. Если совпадение есть, оно будет направлено на этот URL и выполнит соответствующую функцию просмотра. не соответствует, оно будет напрямую перенаправлено на этот адрес. .

return redirect('/dep/66/')