首页 > 其他分享 >django框架-04

django框架-04

时间:2022-09-02 23:24:12浏览次数:50  
标签:return 04 框架 self request django def 模板 view

目录

路由层

网页伪静态

 1.定义:动态网页通过重写URL的方法去掉动态网页的参数 但实际页面还是动态页面(动态页面欺骗浏览器让浏览器认为该页面内容数据是固定不变的 让浏览器收录 用来提高搜索后展示的概率)
 2.方法:将展示页面的后缀名添加文件后缀展示

视图层

视图函数返回值

 1.视图函数:必须返回一个HttpResponse对象
 2.三板斧

  rander返回的是HttpResponce对象:return HttpResponse(content, content_type, status)
  redirect返回是HttpResponse对象:redirect_class = HttpResponsePermanentRedirect if permanent else HttpResponseRedirect
    					return redirect_class(resolve_url(to, *args, **kwargs))
  HttpResponse是一个类: class HttpResponse(HttpResponseBase):

django序列化方法

 1.序列化方法

  1.1 Json方法:存在中文需转换

(ensure_ascii=False)
       import json

       def mylist(request):
            info = {'name': 'lili童鞋', 'age': 22}
            # l1 = json.dumps(info)        # {"name": "lili\u7ae5\u978b", "age": 22}
            l1 = json.dumps(info, ensure_ascii=False)  # {"name": "lili童鞋", "age": 22}
            return HttpResponse(l1) 

  1.2 JsonResponse方法:继承的是json类

        if json_dumps_params is None:
            json_dumps_params = {}
        kwargs.setdefault('content_type', 'application/json')
        data = json.dumps(data, cls=encoder, **json_dumps_params)
        super().__init__(content=data, **kwargs)
    1.2.1 使用JsonResponse方法存在汉字会乱码 可以通过json_dumps_params = {}给它传递实参来解决乱码问题
	from django.http import JsonResponse
	def mylist(request):
        info = {'name': 'lili童鞋', 'age': 23}
        # l1 = JsonResponse(info)      # {"name": "lili\u7ae5\u978b", "age": 23}
        l1 = JsonResponse(info, json_dumps_params={'ensure_ascii': False})     # {"name": "lili童鞋", "age": 23}
        return HttpResponse(l1)
    1.2.2 当序列化的不是字典类型的数据时报错:In order to allow non-dict objects to be serialized set the safe parameter to False.   
    需要确认传递的数据是否安全 防止产生错误 导致系统崩溃(如弹框)
    def mylist(request):
        info = [1, 3, 5]
        # l1 = JsonResponse(info)      # {"name": "lili\u7ae5\u978b", "age": 23}
        l1 = JsonResponse(info, json_dumps_params={'ensure_ascii': False}, safe=False)     # [1, 3, 5]
        return HttpResponse(l1)

form表单操作

 1.携带文件数据具备条件:

  1.1 form表单:
  		method属性值必须是post
 	 	enctype属性值必须是multipart/form-data
  1.2 后端views:
      request.FILES
  html代码:
    <form action="" method="post" enctype="multipart/form-data" >
        <p>username:
            <input type="text" name="username"></p>
        <p>file:
            <input type="file" name="file"></p>
        <input type="submit" class="btn-group-xs" value="提交">
    </form>
后端views代码:
	def myfiles(request):
    if request.method == 'POST':
        print(request.POST)                    # <QueryDict: {'username': ['lili']}>
        print(request.FILES)  # <MultiValueDict: {'file': [<InMemoryUploadedFile: 沐阳晴子.doc (application/msword)>]}>
        file_obj = request.FILES.get('file')
        with open(file_obj.name, 'wb')as f:
            for line in file_obj:
                f.write(line)
    return render(request, 'func.html')

FBV与CBV

FBV

 1.FBV:基于函数的视图

  后端代码:
      def func(request):
        return HttpResponse('橘子蔫了')
  路由匹配代码:
      path('func/', views.func),

CBV

 1.CBV:基于类的视图

  后端代码:
    from django import views

    class Myview(views.View):

        def get(self, request):
            return HttpResponse('get请求')

        def post(self, request):
            return HttpResponse('post请求')
  路由匹配代码:
      path('myview/', views.Myview.as_view())
  注:CBV会根据请求的不同而执行不同的方法

 2.CBV源码分析: path('myview/', views.Myview.as_view())

  2.1 源码分析入口:类.as_view()
      as_view加括号说明是一个方法(类点方法)
      类继承的查找顺序:先从自己类里找 再到继承的父类里找
  2.1 as_view()是在View类下绑定给类的方法
	  class Myview(views.View) 继承View
	  View类中的属性:多个请求类型
      as_view绑定给类的方法执行后返回view(将创建的类作为第一个参数传入)
  2.3 CBV的路由匹配与CBV一致: 
       path('myview/', views.func)
  2.3 路由匹配上之后执行view函数 根据请求不同做判断
	  self = cls(**initkwargs)  # 产生对象	
      返回:return self.dispatch(request, *args, **kwargs)
  2.4 self.dispatch(request, *args, **kwargs)(对象.方法)
      查找方法:对象  产生对象的类  继承的父类
      View父类中有dispatch函数:判断请求方式在View类的属性中的话 将请求方式转为小写
        					 然后将属性返回
 2.5 执行对象.返回的属性 
     查找属性方法 先从对象自己中找 再到产生的类中查找
     我们自己创建的类中有该方法 执行该方法
父类代码: path('myview/', views.Myview.as_view())
      @classonlymethod
      def as_view(cls, **initkwargs):           # 自己创建的类中无该方法 执行父类方法
          return view						  # 返回view
      def view(request, *args, **kwargs):       # 自己创建的类中无该方法 执行父类方法
          self = cls(**initkwargs)
     	  return self.dispatch(request, *args, **kwargs)   # 返回dispatch
      def dispatch(self, request, *args, **kwargs):  # 自己创建的类中无该方法 执行父类方法
         if request.method.lower() in self.http_method_names:
            handler = getattr(self, request.method.lower(), self.http_method_not_allowed)
        else:
            handler = self.http_method_not_allowed
        return handler(request, *args, **kwargs)     # 返回属性值
子类代码:from django import views
        class Myview(views.View):
            def get(self, request):                 # 获得返回的请求类型执行
                return HttpResponse('get请求')
            def post(self, request):
                return HttpResponse('post请求')

模板层

模板语法传值

 1.传值方式:

  1.1 指明道姓
       return render(request, 'func.html', {'name': name})
  1.2 关键字locals()

 2.区别:
  2.1 指明道姓:适用于少量传值 不浪费资源 不适用于多值 较麻烦且混乱
  2.2 关键字locals():可以一次性将局部名称空间中的值一次传入 不适应与少量传值 浪费资源
注:根据实际情况选择传值方式
 3.传值范围

  基本数据类型:int float str list dict tuple set bool都可以展示到页面
  函数名:自动加括号执行将返回值展示到页面(模板语法只执行无参函数)
  类名:自动加括号产生对象并展示到页面
  对象:直接展示到页面
注:模板语法会判断每一个名字是否可以调用 可以就执行调用
    django的模板语法在操作容器类型时只允许使用句点符

模板语法过滤器

 1.过滤器(类似于python内置函数)

类型 作用

{{ s|length }}

length统计l的长度

{{ i|add:123 }}

{{ s|add:'qwe' }}

add数字求和 字符串拼接

{{ d|date:'Y-m-d H:i:s' }}

data日期转换

{{ file_size|filesizeformat }}

filesizeformat文件大小

数据切片:{{ t|slice:'0:10' }}

slice切片

{{ b|truncatechars:3 }}

truncatechars字符截取(显示字符比截取小1个字符)

{{ s1|truncatewords:6 }}

truncatewords单词截取(按空格截取)

{{ mylist|safe }}

语法转义

 注:语法转义:有时候html页面上的数据也可以写在后端 可能导致出现错误 因此需要语法转义

from django.utils.safestring import mark_safe
   script_tag1 = '<script>alert(999)</script>'
   res = mark_safe(script_tag1)

模板语法符号

 1.符号:

  1.1.使用数据:{{}}

  1.2.使用方法:{%%}

模板语法标签

 1.标签(类似于python中的流程控制)

  1.1 if判断

{% if 条件 %}  条件一般是模板语法传过来的数据  直接写名字使用即可
        条件成立执行的代码
    {% elif 条件1 %}
 		  条件1成立执行的代码	
    {% else %}
       	 条件都不成立执行的代码
    {% endif %}

  1.2 for循环

 {% for i in l %}
        {% if forloop.first %}
            <p>第一次循环</p>
        {% elif forloop.last %}
            <p>最后一次循环</p>
        {% else %}
            <p>{{ i }}</p>
        {% endif %}
        {% empty %}
        	  <p>空</p>
    {% endfor %}

自定义相关功能

 1.自定义前提:

  1.1 在应用下创建一个名为templatetags文件夹

  1.2 在该文件夹下创建py文件

  1.3 在该文件夹下编写自定义相关代码

from django.template import Library
register = Library()

 2.自定义类型

  2.1.自定义过滤器

  @register.filter(name='myint')
    def func(a, b):
        return a * b

  2.2.自定义标签函数

@register.simple_tag(name='mt')
    def func(a, b):
        return a + b

  2.3.自定义inclusion_tag

 @register.inclusion_tag(filename='it.html')
    def index(n):
        html = []
        for i in range(n):
            html.append('第%s页'%i)
        return locals()
   	
    {% load mytag %}
    {{ i|myfilter:1 }}
    {% mt 1 2 3 4 %}
    {% index 10 %}

模板继承

 1.模板继承:

{% extends 'html文件名' %}
   	{% block 名字 %}
    	模板内容
	{% endblock %}
   	{% block 名字 %}
    	子板内容
    {% endblock %}
 	一般情况下母板中至少应该有三个区域使得扩展性更高!!!
    	css content js
    {% block css %}
	{% endblock %}
    {% block content %}
	{% endblock %}
    {% block js %}
	{% endblock %}
   	'''子板中还可以使用母板的内容  {{ block.super }} '''

模板导入

 1.将html页面的某个部分当做模块的形式导入使用

{% include 'func.html' %}

标签:return,04,框架,self,request,django,def,模板,view
From: https://www.cnblogs.com/040714zq/p/16651607.html

相关文章

  • Django数据传递与模板语法
    Django数据传递与模板语法视图函数返回值1.视图函数的返回值其实本质上返回的都是HttpResponse对象,HttpResponse其实是一个类,我们最常使用的render和redirect都是这个类......
  • 【Django】 第04回 视图层与模板层
    目录1.网页伪静态2.视图层2.1视图函数的返回值问题2.2视图函数返回json格式数据2.3from表单携带文件数据2.4FEV与CBV2.5CBV源码分析3.模板层3.1模板语法传值3.2......
  • SSM框架整合---简易书籍管理系统
    学习完Spring+SpringMVC+MyBatis,我们需要用一个项目来整合SSM框架,这里我们用一个简易的书籍管理系统来整合SSM框架,并回顾Spring+SpringMVC+MyBatis的内容。注:本篇文章参......
  • 彩虹女神跃长空,Go语言进阶之Go语言高性能Web框架Iris项目实战-完善用户管理EP04
    书接上回,上一回我们完成了用户管理页面的构建,并且通过前端的Vue.js框架动态地获取表单数据,同时异步请求后端Iris接口进行入库操作,过程中使用函数封装可复用的逻辑。本回我......
  • BI_SQL盲注框架使用说明
    简介​ 这里是SQL盲注框架的使用说明文档,这个项目的初衷是为了解决在CTF中编写SQL盲注脚本的不便:大部分时间编写的SQL盲注脚本都是payload指向的,这就导致了基本上一个题要......
  • django之视图层与模板层
    一、伪静态网页'''其实就是如果一个网页如果是一个静态网页的话那么浏览器搜索会更容易搜索的到而如果一个动态网页想要让浏览器更容易搜索到的话可以在路由匹配的时......
  • P1042 [NOIP2003 普及组] 乒乓球
    题目背景国际乒联现在主席沙拉拉自从上任以来就立志于推行一系列改革,以推动乒乓球运动在全球的普及。其中 1111 分制改革引起了很大的争议,有一部分球员因为无法适应新......
  • django_响应对象
    Django_响应对象响应对象响应对象有三种形式:HttpResponse()render()Redirect()(1)HttpResponse()django服务器接收到客户端发来的请求之后,会将提交上来的数据封装成......
  • 04_Linux基础-.&..-cat-tac-重定向-EOF-Shell-more-ps-less-head-tail-sed-grep-which
    04_Linux基础-.&..-cat-tac->&>>-EOF-Shell-more-ps-less-head-tail-sed-grep-which-whereis-PATH-bash-/usr-locate-find一.回顾回顾// 将/home/目录下的所有文件和......
  • mORMot框架样例学习汇总
    SynopsemORMot框架样例学习--汇总00-mORMot安装01-SynopsemORMot框架样例学习-01InMemoryORM......