zoukankan      html  css  js  c++  java
  • Django框架之第四篇(视图层)HttpRequest对象、HttpResponse对象、JsonResponse、CBV和FBV、文件上传、django settings源码分析

    Django框架之第四篇(视图层)--HttpRequest对象、HttpResponse对象、JsonResponse、CBV和FBV、文件上传、django settings源码分析

    视图层

    一、视图函数

    一个视图函数,简称视图,是一个简单的python函数,它接收web请求并且会返回web响应。响应可以是一张网页的html,一个重定向,或者是一张图片。。。

    任何东西都可以。无论是什么逻辑,最后都必须要返回响应。

    二、视图层之HttpRequest对象

    django将请求报文中的请求行,首部信息,内容主题封装成HttpRequest类中的属性。除了特殊说明外,其他均为只读。

    # 1.前台Post传过来的数据,包装到POST字典中
    request.POST
    
    # 2.前台浏览器窗口里携带的数据,包装到GET字典中
    request.GET
    
    # 3.前台请求的方式
    request.method
    
    # 4.post提交的数据,body体的内容,前台会封装成:name=lqz&age=18&sex=1
    request.body
    
    # 5.取出请求的路径,取不到数据部分
    request.path   # /test/blog/
    
    # 6.取出请求的路径,能取到数据部分
    request.get_full_path()   # /test/blog?id=1&name=tom
    
    # 7.META,一个标准的Python 字典,包含所有的HTTP 首部
    request.META
    
    # 8.一个类似于字典的对象,包含所有的上传文件信息
    request.FILES
    #FILES 中的每个键为<input type="file" name="" /> 中的name,值则为对应的数据。
    # 注意,FILES 只有在请求的方法为POST 且提交的<form> 带有enctype="multipart/form-data"
    的情况下才有 # 包含数据。否则,FILES 将为一个空的类似于字典的对象。

    三、视图层之HttpResponse对象

    响应对象主要有三种形式

    HttpResponse()
    render()  
    redirect()

    django视图函数必须要返回一个HttpResponse对象

    1 render()

    render结合一个html页面,并且还能通过字典给该页面传递数据,并返回一个渲染后的HttpResponse对象

    return render(request,'user_list.html',{'user_lists':user_lists})  #'user_lists'传递给页面
    第一个参数是用于生成相应的请求对象,第二个参数是使用的模板名称,第三个参数是传递到模板的数据
    

     render内部原理(?????????????????)

    from django.template import Template,Context
    def index(request):
        temp = Template('<h1>{{ user }}</h1>')
        con = Context({"user":{"name":'jason',"password":'123'}})
        res = temp.render(con)
        print(res)
        return HttpResponse(res)
    

    2.redirect()

    传递需要重定向的url

    def index(request):
    
        return redirect('/index')  
      或者
      return redirect reverse('index')  #这里的index是取得别名
    

    3.HttpResponse()

    def test(request):
        
        return HttpResponse('xxx')  #页面显示xxx
    

    四、视图层之JsonResponse对象

    前端的json

    JSON.stringify()   >>>  json.dumps()

    JSON.parse()    >>>>  json.loads()

    from django.http import JsonResponse
    import json
    1.JsonResponse
    def index(request):
        data = {'name':'jason怎么样','password':123}
        return JsonResponse(data,json_dumps_params={'ensure_ascii':False})  #取消中文转换
    2.HttpResponse
    #使用json转换数据格式
    def index(request):
        data = {'name':'jason怎么样','password':123}
        res = json.dumps(data,ensure_ascii=False)
        return HttpResponse(res)
    3.
    def index(request):
        l=[1,2,3,4,5]
        return JsonResponse(l,safe=False)  #如果返回的不是字典,修改safe参数为false即可
    
    • JsonResponse也是返回给页面的数据,数据格式只能是字典。和HttpResponse类似,只是返回的数据格式不一样。
    • 如果是其他类型数据,需要设置safe = False

     五、FBV和CBV

    FBV和CBV   视图函数并不只是指函数,也可以是类

      FBV(基于函数的视图)  面向函数式编程

      CBV(基于类的视图)    面向对象式编程

    基于CBV的视图(get请求来就会走类里面的get方法,post请求来就会走类里面的post方法)

    需要注意的几点设置:

    1.urls.py

    url(r'^login/',views.MyLogin.as_view())
    

    2.views.py(get请求就走get方法,post请求就走post方法)

    from django.views import View
    
    class MyLogin(View):
          def get(self,request):
               print("from MyLogin get方法")
               return render(request,'login.html')
          def post(self,request):
               return HttpResponse("from MyLogin post方法") 

    基于FBV的视图

    #路由层
    url(r'test/',views.test)
    
    #视图层
    def test(request):
    
        return HttpResponse('test')  

    六、文件上传

    form表单上传文件需要注意的事项

      1.enctype需要由默认的urlencoded变成formdata

      2.method需要由默认的get变成post

      (目前还需要考虑的是提交post请求需要将配置文件中的csrf中间件注释)

    <form action="" method="post" enctype="multipart/form-data">
        <input type="file" name="myfile">
        <input type="text" name="password">
        <input type="submit" value="提交">
    </form>
    

     form表单上传文件,后端需要在request.FIFLES获取文件数据,而不再是POST里面

      七、django settings源码分析

    前提:

    1.django除了暴露给用户一个settings.py配置文件之外,自己内部还有一个全局的配置文件

    2.我们在使用配置文件的时候,可以直接导入暴露给用户的settings.py也可以使用django全局的配置文件,并且后者居多

      from django.conf import settings        from django.conf import global_settings

    3.django的启动入口是manage.py

    manage.py

    if __name__ == "__main__":
        # django在启动的时候 就会往全局的大字典中设置一个键值对  值是暴露给用户的配置文件的路径字符串
        os.environ.setdefault("DJANGO_SETTINGS_MODULE", "day54.settings")
    

     from django.conf import settings  从settings进入

    settings = LazySettings()  # 单例模式    
    
    class LazySettings(LazyObject):
        def _setup(self, name=None):
            # os.environ你可以把它看成是一个全局的大字典
            settings_module = os.environ.get(ENVIRONMENT_VARIABLE)  # 从大字典中取值键为DJANGO_SETTINGS_MODULE所对应的值:day54.settings
            # settings_module = 'day54.settings'
            self._wrapped = Settings(settings_module)  #Settings('day54.settings')
    

      

    class Settings(object):
        def __init__(self, settings_module):  # settings_module = 'day54.settings'
            # update this dict from global settings (but only for ALL_CAPS settings)
            for setting in dir(global_settings):  # django全局配置文件
                # dir获取django全局配置文件中所有的变量名
                if setting.isupper():  # 判断文件中的变量名是否是大写 如果是大写才会执行/生效
                    setattr(self, setting, getattr(global_settings, setting))  # 给settings对象设置键值对
                    # 给settings对象设置键值对  settings[配置文件中大写的变量名] = 配置文件中大写的变量名所对应的值
    
            # store the settings module in case someone later cares
            self.SETTINGS_MODULE = settings_module  # 'day54.settings'
    
            mod = importlib.import_module(self.SETTINGS_MODULE)  # mod = 模块settings(暴露给用户的配置文件)
            for setting in dir(mod):  # for循环获取暴露给用户的配置文件中所有的变量名
                if setting.isupper():  # 判断变量名是否是大写
                    setting_value = getattr(mod, setting)  # 获取大写的变量名所对应的值
                    setattr(self, setting, setting_value)  # 给settings对象设置键值对
                    """
                    d = {}
                    d['username'] = 'jason'
                    d['username'] = 'egon'
                    用户如果配置了就用用户的
                    用户如果没有配置就用系统默认的
                    其实本质就是利用字典的键存在就是替换的原理 实现了用户配置就用用户的用户没配置就用默认的    
    

      

  • 相关阅读:
    Tarjan算法与割点割边
    kmp匹配
    最小表示法
    字典树
    哈希
    网络流入门浅谈
    关于两道搜索的题目
    2020 4.2校内测题解
    LIS最长上升子序列讲解&&洛谷P1439 【模板】最长公共子序列 题解
    浅谈拉格朗日插值公式
  • 原文地址:https://www.cnblogs.com/ltyc/p/13806216.html
Copyright © 2011-2022 走看看