Django 视图

一个视图函数(类),简称视图,是一个简单的Python 函数(类),它接受Web请求并且返回Web响应。

响应可以是一张网页的HTML内容,一个重定向,一个404错误,一个XML文档,或者一张图片。

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

代码解释:

  • 首先,我们从 django.http模块导入了HttpResponse类,以及Python的datetime库。

  • 接着,我们定义了current_datetime函数。它就是视图函数。每个视图函数都使用HttpRequest对象作为第一个参数,并且通常称之为request

    注意,视图函数的名称并不重要;不需要用一个统一的命名方式来命名,以便让Django识别它。我们将其命名为current_datetime,是因为这个名称能够比较准确地反映出它实现的功能。

  • 这个视图会返回一个HttpResponse对象,其中包含生成的响应。每个视图函数都负责返回一个HttpResponse对象。

Django使用请求和响应对象来通过系统传递状态。

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

每个视图负责返回一个HttpResponse对象。

CBV和FBV

FBV :function based view   基于函数的视图

CBV:class based view 基于类的视图

基于FBV的视图

def add_grade(request):
    err_msg, new_name = '', ''  
    if request.method == 'POST':        
        new_name = request.POST.get('grade_name', '').strip()  
        if not new_name:            
            err_msg = '数据不能为空'
        obj_name = models.Grade.objects.filter(name=new_name)
        if obj_name:
            err_msg = '数据以存在'
        if new_name and not obj_name:      
            models.Grade.objects.create(name=new_name)
            return redirect('/grade/')
    return render(request, 'add_grade.html', {'err_msg': err_msg, 'name': new_name})

基于CBV视图

from django.views import View
class AddGrade(View):
    #可以更改 http_method_names中的内容,来确定可以提交那种请求,
    http_method_names = ['get', 'post', 'put', 'patch', 'delete',     'head', 'options', 'trace']

    # http_method_names = ['get', ]
    # 此时只能提交get请求了

    def get(self,request):
        print('get')
        return render(request,'add_grade.html')
    def post(self,request):
        err_msg =''
        new_name = request.POST.get('grade_name', '').strip()  # 不能输入空格
        if not new_name:
            err_msg = '数据不能为空'
        obj_name = models.Grade.objects.filter(name=new_name)
        if obj_name:
            err_msg = '数据以存在'
        if new_name and not obj_name:
            models.Grade.objects.create(name=new_name)

            return redirect('/grade/')

        return render(request, 'add_grade.html', {'err_msg': err_msg, 'name': new_name})

使用

url(r'^add_grade/', views.add_grade), #基于FBV视图

url(r'^add_grade/', views.AddGrade.as_view()), #基于CBV视图

添加装饰器

PBV :直接添加

CBV

from django.utils.decorators import method_decorator

#加载某一个方法上
@method_decorator(timer)
def get(self, request):

#加载dispatch方法上面
class AddGrade(View):
    #可以更改 http_method_names中的内容,来确定可以提交那种请求,
    http_method_names = ['get', 'post', 'put', 'patch', 'delete', 'head', 'options', 'trace']

    # http_method_names = ['get', ]
    # 此时只能提交get请求了
    @method_decorator(timer) #timer:装饰器名称
    def dispatch(self, request, *args, **kwargs):
        super().dispatch(request,*args,**kwargs)

    def get(self, request):
        print('get')
        return render(request, 'add_grade.html')


#加在类上
@method_decorator(timer, 'post')
@method_decorator(timer, 'get')
class AddPublisher(View):

requerst对象

print(request.method)   # 请求方式  GET POST PUT
print(request.GET)      # URL携带的参数  { ‘name’: ['alex']   }   []  .get('name')
print(request.POST)     # POST请求提交的数据  { ‘name’: ['alex']   }   .getlist()
print(request.path_info)  # 路径信息  不包含ip和端口 参数
print(request.schene)   #判断请求是否安全 https
print(request.FILES)   #上传文件
print(request.META)
print(request.COOKIES)
print(request.session)
print(request.get_host()) 
print(request.get_full_path())  # 路径信息  不包含ip和端口  带参数
print(request.is_ajax())  # 判断是否是ajax请求
View Code

上传文件

<body>
<form action="" method="post" enctype="multipart/form-data">
    {% csrf_token %}
    <input type="file" name="f1">
    <button>上传</button>
</form>

</body>
def upload(request):
    if request.method == 'POST':
        f1 = request.FILES.get('f1')
        with open(f1.name,'wb') as f :
            for i  in f1.chunks():
                f.write(i)
        return HttpResponse('上传成功')

    return render(request,'upload.html')

JsonResponse

JsonResponse是HttpResponse的子类,专门用来生成JSON编码的响应。

from django.http import JsonResponse


def json_data(request):
    data = {'id': 11, 'name': 'alex'}
    l1 = ['qwe', 'dasd']

    return JsonResponse(l1)  # Content-Type: application/json

默认只能传递字典类型,如果要传递非字典类型需要设置一下safe关键字参数   

response = JsonResponse([1, 2, 3], safe=False)

 

原文地址:https://www.cnblogs.com/wanglan/p/10311491.html