首页 > 其他分享 >Django-视图

Django-视图

时间:2024-10-21 22:17:41浏览次数:8  
标签:HttpRequest request 视图 django import HttpResponse Django def

Django的视图有两种形式 : FBV与CBV

FBV 是基于函数的视图 (function base views)

CBV 是基于类的视图(class base views)

  • 视图函数 current_datetime,每个视图函数都将一个HttpRequest 对象作为其第一个参数,该参数通常被命名request
  • 视图函数的名称无关紧要,它不必以某种方式命名,以便Django能够识别它,但是函数命名一定要能够清晰的描述它的功能
  • 视图函数返回一个HttpResponse响应的对象,每个视图函数负责返回一个HttpResponse对象
  • ---------------------------------------------------------------------------------------------------------------------------
  • CBV提供了一个as_view()静态方法(也就是类方法),调用这个方法,会创建一个类的实例,然后通过实例调用dispatch()方法,dispatch()方法会根据request的method的不同调用相应的方法来处理request(如get(),post()等)
  • 提高了代码的复用性,可以使用面向对象的技术,比如Mixin(多继承)
  • 可以用不同的函数针对不同的HTTP方法处理,而不是通过很多 if 判断,可以提高代码可读性
# urlconf 中
urlpatterns = [
    path('fbv/', views.current_datetime),
]


# views 中
from django.http import HttpResponse
import datetime


def current_datetime(request):
  now = datetime.datetime.now()
  html = "<html><body>It is now %s.</body></html>" % now
  return HttpResponse(html)

# =====================================
# urlconf 中
urlpatterns = [
  # 一定要使用 as_view() ,记住 小括号
    path('cbv/', views.MyView.as_view()),
]


# views中
from django.http import HttpResponse
from django.views import View
 
class MyView(View):


  def get(self, request):
    return HttpResponse('get OK')


  def post(self, request):
    return HttpResponse('post OK')

返回错误相应

  • 返回 HttpResponseNotFound
  • 返回 HttpResponse 设置 status 状态码
  • 返回 Http404状态对象
from django.shortcuts import render
from django.http import HttpResponseNotFound

# Create your views here.
# 使用 HttpResponseNotFound
def error1(request):
  return HttpResponseNotFound('<h1>Page not found</h1>')


# 还可以直接返回状态码
from django.http import HttpResponse
def error2(request):
  return HttpResponse(status=404)


# 特殊的 404  错误
from django.http import Http404
from django.shortcuts import render


def error3(request, poll_id):
  print(type(poll_id))
  raise Http404(f"Model does not exist,{poll_id}")
  return HttpResponse('<h1>Page was found</h1>')

视图装饰器

@require_http_methods,要求视图只接收指定的http方法

@require_GET():仅仅允许GET方法

@require_POST():仅仅允许POST方法

@require_safe():仅仅允许GET和HEAD方法

from django.views.decorators.http import require_http_methods


# 允许 GET和POST方法, 默认就是所有方法都支持
@require_http_methods(["GET", "POST"])
def my_view(request):
  pass

# 只允许GET访问
@require_GET()
def g_e_t(request):
    pass


@login_required

必须登录才能访问装饰的视图函数,

用户未登录,则重定向到settings.LOGIN_URL,除非指定了login_url参数,例如:@login_required(login_url='/polls/login/')

# 在settings.py文件中添加
LOGIN_URL = "/go_login/"

'''
之后在视图函数中创建该路由,如果用户没有登录就会自动跳转到这个go_login页面
至于怎么知道用户登录没,还没学,等着吧

'''
@login_required
def my_view(request):
  pass

# 或者
@login_required(login_url = "/go_login/")
def my_view(request):
  pass

请求对象HttpRequest

属性(除非另有说明,否则所有属性均应视为只读):

  • HttpRequest.scheme:

    表示请求使用的协议(http或https)

  • HttpRequest.body:

    原始HTTP请求主体,类型是字节串。处理数据一些非html表单的数据类型很有用,譬如:二进制图像,XML等;

    • 取form表单数据,请使用 HttpRequest.POST
    • 取url中的参数,用HttpRequest.GET
  • HttpRequest.path:

    表示请求页面的完整路径的字符串,不包括scheme和域名。

    例: "/music/bands/the_beatles/"

  • HttpRequest.method:

    表示请求中使用的HTTP方法的字符串,是大写的。例如:

    if request.method == 'GET':

               do_something()

    elif request.method == 'POST':

              do_something_else()

  • HttpRequest.encoding:

    表示当前编码的字符串,用于解码表单提交数据(或者None,表示使用该DEFAULT_CHARSET设置)。

    可以设置此属性来更改访问表单数据时使用的编码,修改后,后续的属性访问(例如读取GET或POST)将使用新encoding值。

  • HttpRequest.content_type:

    表示请求的MIME类型的字符串,从CONTENT_TYPE解析 。

  • HttpRequest.content_params:

    包含在CONTENT_TYPE 标题中的键/值参数字典。

  • HttpRequest.GET:

    包含所有给定的HTTP GET参数的类似字典的对象。请参阅QueryDict下面的文档。

  • HttpRequest.POST:

    包含所有给定HTTP POST参数的类似字典的对象,前提是请求包含表单数据。请参阅QueryDict文档。POST不包含文件信息,文件信息请见FILES。

  • HttpRequest.COOKIES:

    包含所有Cookie的字典,键和值是字符串。

  • HttpRequest.FILES:

    包含所有上传文件的类似字典的对象

  • HttpRequest.META:

    包含所有可用HTTP meta的字典

中间件设置的属性:

Django的contrib应用程序中包含的一些中间件在请求中设置了属性。如果在请求中看不到该属性,请确保使用了相应的中间件类MIDDLEWARE

  • HttpRequest.session:

    来自SessionMiddleware:代表当前会话的可读写字典对象。

  • HttpRequest.site:

    来自CurrentSiteMiddleware: 代表当前网站的实例Site或 RequestSite返回get_current_site()

  • HttpRequest.user:

    来自AuthenticationMiddleware:AUTH_USER_MODEL代表当前登录用户的实例

详细参考官方文档请求和响应对象 | Django 文档 | Django


QueryDict对象

获取单个数据

  • queryDict.get(key)  如果键有多个值,获取的值为最后一个值
  • queryDict[key]  如果键有多个值,获取的值为最后一个值

        

  • 获取多个数据

    • queryDict.getlist(key)
  • 获取key与value

    • list(queryDict.items())  如果键有多个值,获取的值为最后一个值
from django.http import HttpResponse


def query_index(request):
  # 获取参数
  params = request.GET
  # 打印params类型
  print(type(params)) # <class 'django.http.request.QueryDict'>
  # 获取单个值
  s_value1 = params.get('a') # 推荐
  s_value2 = params['a'] # 如果没有值,会报错
  s_value3 = params.get('c')
  # 获取多个值
  m_value = params.getlist('c')
  # 同时获取key 与 value
  kv_value = list(params.items())
  # 返回结果
  return HttpResponse(f'request.GET:{params}<br/>类型是:{type(params)}<br/>s_value1:{s_value1}<br/>s_value2:{s_value2}<br/>  s_value3:{s_value3} <br/> m_value:{m_value}<br/>kv_value:{kv_value}')


        


HttpResponse相应对象

from django.http import HttpResponse
response = HttpResponse("Here's the text of the web page.")
response = HttpResponse("Text only, please.", content_type="text/plain")
response = HttpResponse(b'Bytestrings are also accepted.')
  • HttpResponse.content:

    表示响应的字符串

  • HttpResponse.charset:

    表示响应将被编码的字符集,如果在HttpResponse实例化时没有给出,则会从中提取 content_type,如果没有设置content_type,则使用settings.DEFAULT_CHARSET

  • HttpResponse.status_code:

    该响应的 HTTP 状态码

  • HttpResponse.reason_phrase:

    响应的HTTP原因描述语,使用HTTP标准的默认原因描述语 除非明确设置,否则reason_phrase由 status_code 决定。

  • HttpResponse.streaming:

    总是False,中间件通过此属性可以区分流式响应与常规响应

  • HttpResponse.closed:

    如果response已经结束,则返回True,否则返回False

from django.http import JsonResponse


response = JsonResponse({'foo': 'bar'})
print(response.content) # 打印  b'{"foo": "bar"}'

FileResponse对象(文件资源)

import os
from django.conf import settings
from django.http import FileResponse


def resp_file(request):
  file_path = os.path.join(settings.BASE_DIR,'imgs/tu1.png')
  return FileResponse(open(file_path,'rb'),filename='tu1.png')

返回模板templates

  1. 必需的参数

    • request:用于生成此响应的请求对象
    • template_name:要使用的模板的全名或模板名称的列表
  2. 可选参数

    • context:要添加到模板上下文的值的字典。默认情况下,这是一个空字典。如果字典中的值是可调用的,视图将在渲染模板之前调用它
    • content_type:用于生成文档的MIME类型。默认为DEFAULT_CONTENT_TYPE设置的值
    • status:响应的状态码。默认为200
    • using:用于加载模板的模板引擎名
  3. 整体流程,子应用中创建templates文件夹,在主应用settings中配置TEMPLATES的DIRS路径,之后在templates文件夹中创建html文件。
from django.shortcuts import render

from django.http import HttpResponse
from django.template import loader
# Create your views here.


def template1(request):
    return render(request, '子应用/index.html',{'name':'郑大帅'})

def template2(request):
    t = loader.get_template('子应用/index.html')
    c = {'name':'张小美'}
    return HttpResponse(t.render(c,request),content_type="text/html; charset=utf-8")


请求重定向

访问url已经过期,帮用户自动重定向到新url

from django.shortcuts import redirect


def my_view(request):


  return redirect('https://www.itbaizhan.com/')


def my_view(request):
  return redirect('/some/url/')

# 使用这种方式节约维护开发成本,只要重定向别名不变,前面可以随意改变
def my_view(request):
  return redirect('polls:index', foo='bar')

'''
默认情况下,redirect()返回一个临时重定向(302)。

如果要设置永久重定向(301)设置permanent参数;为True即可
'''

def my_view(request):
  return redirect('polls:index', permanent=True)

get_object_404函数

找不到数据或者匹配不到数据就会返回404页面,提供便捷写法

  • 必需的参数

    • klass:一Model类或一个Manager或QuerySet从哪个实例来获取对象
    • **kwargs:查找参数,应该采用get()或filter()的参数
from django.shortcuts import get_object_or_404
from .models import Salary


def my_view(request):
  poll = get_object_or_404(klass = Salary, pk=1)


#等同于
def my_view(request):
  try:
    poll = Salary.objects.get(pk=1)
  except Salary.DoesNotExist:
    raise Http404()

内置通用视图

有一个通用的模板,方便从数据库获取数据并传递给templates页面,具体要看点源码。看看别人返回了什么,包括视图说明

也能自己手搓获取数据并显示,模板只是提供便捷.解决掉重复的开发

具体有

__all__ = [
  'View', 'TemplateView', 'RedirectView', 'ArchiveIndexView',
  'YearArchiveView', 'MonthArchiveView', 'WeekArchiveView', 'DayArchiveView',
  'TodayArchiveView', 'DateDetailView', 'DetailView', 'FormView',
  'CreateView', 'UpdateView', 'DeleteView', 'ListView', 'GenericViewError',
]

template文件夹中的html怎么在前端页面显示

# template(detail.html)
{{object}}
# template(list.tml)
{{object_list}}

from django.shortcuts import render
from error_app.models import Salary
# Create your views here.
from django.views import generic

# 获取单条数据
class MyDetailView1(generic.DetailView):
  # 设置要返回哪个model的数据
  model= Salary
  # 设置让哪个模板渲染数据
  template_name='detail.html'


class MyDetailView2(generic.DetailView):
  # 设置要返回哪个model的数据
  queryset= Salary.objects.all()
  # 设置让哪个模板渲染数据
  template_name='detail.html'


# 获取多条数据
class MyListView(generic.ListView):
  # 设置要返回哪个model的数据
  model= Salary
  # 设置让哪个模板渲染数据
  template_name='list.html'

标签:HttpRequest,request,视图,django,import,HttpResponse,Django,def
From: https://blog.csdn.net/weixin_65791897/article/details/143110376

相关文章

  • 基于django+vue+Vue健身房服务系统【开题报告+程序+论文】-计算机毕设
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容选题背景随着健康意识的提升,健身房作为促进全民健康的重要场所,其服务质量与管理效率直接影响到用户体验及行业竞争力。关于健身房服务系统的研究,现......
  • 基于django+vue+Vue景区论坛攻略网站设计与实现13zrm【开题报告+程序+论文】-计算机毕
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容一、选题背景关于景区论坛攻略网站的研究,现有研究多集中于旅游网站的整体框架或单一功能模块,专门针对景区论坛攻略网站的系统性研究较少。在国内外......
  • 基于django+vue+Vue教务管理系统q6190【开题报告+程序+论文】-计算机毕设
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容一、选题背景关于教务管理系统的研究,现有研究多集中在系统的基本功能实现方面,如学生选课、成绩管理等常规功能的开发与优化。专门针对教务管理系统......
  • 基于django+vue+Vue健身房管理系统g750b【开题报告+程序+论文】-计算机毕设
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容一、选题背景关于健身房管理系统的研究,现有研究多集中于传统的管理模式改进方面,如单纯的会员信息管理或课程安排优化等。专门针对整合会员、教练、......
  • 基于django+vue+Vue健身房服务系统q91ud【开题报告+程序+论文】-计算机毕设
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容一、选题背景关于健身房服务系统的研究,现有研究多集中在健身房的运营管理或单一功能模块的优化上,如会员管理或课程安排等方面。专门针对整合会员、......
  • 基于django+vue+Vue景区论坛攻略网站设计与实现【开题报告+程序+论文】-计算机毕设
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容选题背景随着互联网技术的飞速发展和人们旅游需求的日益增长,景区论坛攻略网站作为一种重要的旅游信息交流平台,其重要性日益凸显。现有研究主要集中......
  • 基于django+vue+Vue教务管理系统【开题报告+程序+论文】-计算机毕设
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容选题背景教务管理系统作为高校日常运作的核心支撑平台,其重要性不言而喻。当前,国内外对于教务管理系统的研究主要集中在系统架构设计、数据处理效率......
  • 基于django+vue+Vue健身房管理系统【开题报告+程序+论文】-计算机毕设
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容选题背景随着人们健康意识的日益增强,健身房已成为现代都市生活中不可或缺的一部分。关于健身房管理系统的研究,现有研究主要以传统的人工管理和简单......
  • Python+Django智慧农场管理系统
    收藏关注不迷路!!需要的小伙伴可以发链接或者截图给我项目介绍互联网日益成熟,走进千家万户,改变多个行业传统的工作方式。智慧农场管理以用户需求为基础,借由发展迅猛的互联网平台实现智慧农场管理的信息化,简化旧时智慧农场管理所需的纸质记录这一繁杂过程,从而大幅提高智慧农......
  • Python+Django智慧养老系统-养老信息服务平台
    收藏关注不迷路!!需要的小伙伴可以发链接或者截图给我项目介绍伴随着我国社会的发展,人民生活质量日益提高。互联网逐步进入千家万户,改变传统的管理方式,智慧养老系统-养老信息服务平台以互联网为基础,利用Python技术,结合Django框架和MySQL数据库开发设计一套基于B/S的智慧养老......