6.Django_view视图

本文介绍了Django的View概念,包括函数视图和类视图。函数视图以request参数接收HttpRequest对象并返回HttpResponse。类视图则简化了视图的定义,通过定义不同方法处理不同请求类型。文中展示了如何定义类视图,并讨论了在处理POST请求时CSRF验证的问题及其解决方案。
摘要由CSDN通过智能技术生成
Django的View:

一个视图函数(类),简称视图,是一个简单的Python 函数(类),它接受Web请求并且返回Web响应。响应可以是一张网页的HTML内容,一个重定向,一个404错误,一个XML文档,或者一张图片。

无论视图本身包含什么逻辑,都要返回响应。代码写在哪里也无所谓,只要它在你当前项目目录下面。除此之外没有更多的要求了——可以说“没有什么神奇的地方”。为了将代码放在某处,大家约定成俗将视图放置在项目(project)或应用程序(app)目录中的名为views.py的文件中。

看一下我们第一个应用中定义的view视图

from django.http import HttpResponse
from django.views import View


def index(request):
    return HttpResponse("你好, django.  You're at the polls index.")

函数视图:

上面是一个函数视图

  • 函数视图的第一个参数是request,是HttpResponse的对象,包含前端用户的所有请求信息;
  • 必须返回一个HttpResponse的对象或者子对象;

当浏览器向服务端请求一个页面时,Django创建一个HttpRequest对象,该对象包含关于请求的元数据。然后,Django加载相应的视图,将这个HttpRequest对象作为第一个参数传递给视图函数。每个视图负责返回一个HttpResponse对象。

类视图:

上面那种视图比较麻烦每次都需要定义很多,下面看一下类视图:

1. project1/views.py中,定义 indexView类视图:
from django.http import HttpResponse

# Create your views here.
from django.views import View


def index(request):
    return HttpResponse('你好,欢迎来到project1,index')

#定义类视图,主要参数是View,主要导入
class indexView(View):
    'index主页类视图'
    def get(self,request):
        return HttpResponse('GET请求')
    def post(self,request):
        return HttpResponse('POST请求')
    def delete(self,request):
        return HttpResponse('delete请求')
    def put(self,request):
        return HttpResponse('PUT请求')
2.定义类视图路径,project1/urls.py中:
from django.urls import path

from project1.views import index
from . import views

## 指定当前应用的命名空间
app_name = 'project1'

urlpatterns = [
    # url路径,所映射的view方法,对应的名称
   
    #使用类视图,需要使用,注意写法需要添加as_view
    path('',views.indexView.as_view(),name='index')


]
3.运行后直接浏览器访问:

在这里插入图片描述
浏览器直接访问默认是get请求,此时可以在postman接口请求工具中进行验证post请求和别的请求;
在这里插入图片描述

4.发送post请求

发现访问被拦截,此时可以在根目录settings文件中进行注释掉CSRF验证:

MIDDLEWARE = [
    'django.middleware.security.SecurityMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.common.CommonMiddleware',
    #注释掉此行
    # 'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
]

然后再进行启动服务,现在可见请求post请求正常;别的请求相同;
在这里插入图片描述

from django.contrib import admin from django.urls import reverse from django.utils.html import format_html from django.shortcuts import redirect from .models import Drug @admin.register(Drug) class DrugAdmin(admin.ModelAdmin): change_list_template = 'admin/drug/change_list.html' def get_urls(self): urls = super().get_urls() custom_urls = [ path('import-csv/', self.import_csv), ] return custom_urls + urls def import_csv(self, request): if request.method == 'POST': # TODO: import CSV data self.message_user(request, 'CSV data imported successfully') return redirect('..') return render(request, 'admin/drug/import_csv.html') def changelist_view(self, request, extra_context=None): if not request.GET.get('ordering'): # set default ordering request.GET = request.GET.copy() request.GET['ordering'] = 'name' return super().changelist_view(request, extra_context=extra_context) def interaction_display(self, obj): return format_html('<pre>{}</pre>', obj.interaction) interaction_display.short_description = 'Interaction' def get_actions(self, request): actions = super().get_actions(request) del actions['delete_selected'] return actions def delete_model(self, request, obj): # TODO: delete model pass def delete_selected(self, request, queryset): # TODO: delete selected models pass def get_queryset(self, request): qs = super().get_queryset(request) qs = qs.order_by('name') return qs def add_view(self, request, form_url='', extra_context=None): self.change_list_template = None return super().add_view(request, form_url=form_url, extra_context=extra_context) def change_view(self, request, object_id, form_url='', extra_context=None): self.change_list_template = None return super().change_view(request, object_id, form_url=form_url, extra_context=extra_context) def delete_view(self, request, object_id, extra_context=None): self.change_list_template = None return super().delete_view(request, object_id, extra_context=extra_context) 怎么重写ModelAdmin的特性
05-18
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值