zoukankan      html  css  js  c++  java
  • 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)

     

  • 相关阅读:
    【翻译/介绍】jump consistent hash:零内存消耗,均匀,快速,简洁,来自Google的一致性哈希算法 [2015-03-13]
    现代密码学实践指南[2015年]
    本博客迁走了
    高性能web系统的架构和系统优化
    vs 2013调试的时候重启的解决方案
    年会与项目管理
    javascript 关闭窗口,弹出新窗口并带有确认关闭对话框解决办法
    成长
    POCO exception
    通过OpenGL ES在iOS平台实践增强现实(二)
  • 原文地址:https://www.cnblogs.com/wanglan/p/10311491.html
Copyright © 2011-2022 走看看