Django之视图

Django视图

  • 基于nazha老师:http://www.cnblogs.com/liwenzhou/articles/8305104.html

  • 前言:对于对小数据的处理,可以直接使用Django内置的数据库sqlite3,

    • sqlite: 是一种文件数据库,使用单独一个文件保存数据
    • 多用于嵌入式,该文件中类似于mysql也存在很多表
    • 在pycharm中连接sqlite3,与mysql类似,首次使用需要在下载驱动
  • 视图函数(类)简称为视图,是一个简单的Python函数(类),接受web请求并返回web响应

  • FBV(Function Base View) 和CBV(Class Base View)

    • FBV是基于函数的视图

      • 视图函数中通过request.method 的不同进而执行不同的代码

      • 实例代码

        • # views.py中 FBV版添加班级
          def add_class(request):
              if request.method == "POST":
                  class_name = request.POST.get("class_name")
                  models.Classes.objects.create(name=class_name)
                  return redirect("/class_list/")
              return render(request, "add_class.html")
          # urls.py 中
          from app01 import views
          urlpatterns = [
              url(r'^add_class/$', views.add_class)
          ]
          
    • CBV 基于类的视图

      • 视图类必须继承 django.views.view

      • 在类中定义与请求方法同名的方法

      • urls.py中注册视图的时候区别于FBV要写成 类名.as_view()

      • 实例代码

        • # views.py 中   CBV版添加代码
          from django.views import View
          class add_class(View):
              def get(self, request):
                  return render(request, "add_class.html")
              
              def post(self, request):
                  class_name = request.POST.get("class_name")
                  models.Classes.objects.create(name=class_name)
                  return credits("/class_list/")
           # url.py 中
          urlpatterns = [
              url(r"^add_class/$", view.add_class.as_views())
          ]
          
  • Request对象和Response对象

    • request对象的属性和方法

      1. request.method 请求中使用的HTTP方法的字符串表示,全大写
      2. request.path_info 返回用户访问的url,不包括域名
      3. request.get_full_path() 获取URL,带参数
      4. request.GET 包含所有HTTP GET参数的类字典对象
        1. request.POST.get()
        2. request.POST.getlist()
      5. reques.POST 包含所有HTTP POST参数的类字典对象
      6. request.body 请求体,byte类型 request.POST的数据就是从body里面提取到的
      7. request.META
      8. request.FILES 获取到上传文件的的类字典
        1. request.FILES.get()
        2. request.FILES.getlist() 上传多个文件
    • 上传文件实例

      • 1.from表单必须设置 method="POST" action="" enctype="multipart/form-data"

      • 2.file_obj = request.FILES.get("xxx")

      • 3.file_obj.name

      • 4.在本地保存文件

        • chunks(chunk_size=自定义字节大小),有chunk_size参数,可以自定义每次接收多少
      • # views.py中上传代码
        class Upload2(View):
            def get(self, request):
                return render(request, "upload2.html")
        
            def post(self, request):
                name = request.POST.get("name")
                print(name, "#"*129)
                filename_obj = request.FILES.get("filename")   # 获取上传文件的对象
                filename_name = filename_obj.name    # 在对象中获取上传文件的名字
                print("文件对象:",filename_obj, "文件对象类型:", type(filename_obj), "
        ", "文件名字", filename_name, "文件名类型", type(filename_name))
                # 文件对象: 323088.jpg 文件对象类型: <class 'django.core.files.uploadedfile.InMemoryUploadedFile'>
                with open(filename_name, "wb") as f1:
                    for i in filename_obj.chunks():     # chunks()   一种内置的方法,括号内有chunk_size参数,可以自定义每次接收多少, 与for i in filename_obj:  区别不大
                        f1.write(i)
                    else:
                        return HttpResponse("上传完毕")
        
        # urls.py 中的代码
        from app01 import views
        urlpatterns = [
            # url(r"^add_class", views.add_class.as_views()),
        ]
        
原文地址:https://www.cnblogs.com/yuncong/p/9944187.html