视图层

一、视图函数

一个视图函数,简称视图,是一个简单的python函数,它接收web请求并且会返回web响应。响应可以是一张网页的html,一个重定向,或者是一张图片。。。任何东西都可以。无论是什么逻辑,最后都必须要返回响应。

二、视图层之HttpRequest对象

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

# .前台Post传过来的数据,包装到POST字典中
request.POST # .前台浏览器窗口里携带的数据,包装到GET字典中
request.GET # .前台请求的方式
request.method # .post提交的数据,body体的内容,前台会封装成:name=lqz&age=&sex=
request.body # .取出请求的路径,取不到数据部分
request.path # /test/blog/ # .取出请求的路径,能取到数据部分
request.get_full_path() # /test/blog?id=&name=tom # .META,一个标准的Python 字典,包含所有的HTTP 首部
request.META # .一个类似于字典的对象,包含所有的上传文件信息
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":''}})
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
.JsonResponse
def index(request):
data = {'name':'jason怎么样','password':}
return JsonResponse(data,json_dumps_params={'ensure_ascii':False}) #取消中文转换
.HttpResponse
#使用json转换数据格式
def index(request):
data = {'name':'jason怎么样','password':}
res = json.dumps(data,ensure_ascii=False)
return HttpResponse(res)
.
def index(request):
l=[,,,,]
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.FILES获取文件数据,而不再是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'
用户如果配置了就用用户的
用户如果没有配置就用系统默认的
其实本质就是利用字典的键存在就是替换的原理 实现了用户配置就用用户的用户没配置就用默认的

Django框架之第四篇(视图层)--HttpRequest对象、HttpResponse对象、JsonResponse、CBV和FBV、文件上传的更多相关文章

  1. Django框架(五)-- 视图层:HttpRequest、HTTPResponse、JsonResponse、CBV和FBV、文件上传

    一.视图函数 一个视图函数,简称视图,是一个简单的Python 函数,它接受Web请求并且返回Web响应.响应可以是一张网页的HTML内容,一个重定向,一个404错误,一个XML文档,或者一张图片. ...

  2. Django框架(六)—— 视图层:HttpRequest、HTTPResponse、JsonResponse、CBV和FBV、文件上传

    目录 视图层 一.视图函数 二.视图层之HttpRequest对象 三.视图层之HttpResponse对象 四.视图层之JsonResponse对象 五.CBV和FBV 六.文件上传 视图层 一.视 ...

  3. Django 10 GET和POST(HttpRequest对象,GET和POST请求,文件上传,HttpResponse对象的cookie)

    Django 10 GET和POST(HttpRequest对象,GET和POST请求,文件上传,HttpResponse对象的cookie) 一.HttpRequest对象 #HttpRequest ...

  4. 一、虚拟环境.二、路由配置主页与404.三、2.x路由分发.四、伪静态.五、request对象.六、FBV与CBV.七、文件上传.

    一.虚拟环境 ''' 解决版本共存 1. 用pycharm选择File点击NewProject然后选择virtualenv创建一个纯净环境 2. 打开下载的目录将venv文件夹下的所有文件(纯净的环境 ...

  5. 第二章:视图层 - 7:HttpResponse对象

    类定义:class HttpResponse[source] HttpResponse类定义在django.http模块中. HttpRequest对象由Django自动创建,而HttpRespons ...

  6. Django框架之第八篇(模型层补充)--数据库的查询与优化:only/defer,select_related与prefetch_related,事务

    在设置外键字段时需要注意: 当你使用django2.x的版本时候,在建立外键关系时,需要你手动添加几个关键点参数 models.cascade #设置级联删除 db_constraints 数据库查询 ...

  7. Django之三种文件上传

    方式一: 通过form表单提交到后台 前端: <!DOCTYPE html> <html lang="en"> <head> <meta ...

  8. 文件上传Django

    当Django在处理文件上传的时候,文件数据被保存在request.FILES FILES中的每个键为<input type="file" name="" ...

  9. django文件上传

    -------------------上传图片-------------------1.model中定义属性类型为models.ImageField类型 pic=models.ImageField(u ...

随机推荐

  1. Linux下g++编译thread出错的的解决方法

    错误如下图所示: 因为thread是C++11新加入的特性,所以我们在用g++编译的时候不能直接用,需要在g++后面加上 -std=c++0x -pthread 如果是gcc编译多线程的话则应该要用 ...

  2. 【Python笔记】1、格式化输出(%用法和format用法)

    转自:https://www.cnblogs.com/fat39/p/7159881.html 一.格式化输出1.整数的输出%o —— oct 八进制%d —— dec 十进制%x —— hex 十六 ...

  3. Android编程权威指南笔记2:解决R文件爆红问题和SDK概念

    在android studio中会遇到R文件的丢失,所以遇见这问题怎么解决呢? 重新检查资源文件中xml文件 最近一次编译时如果未生成R.java文件,项目中资源引用的地方都会出错.通常,这是某个xm ...

  4. mac下 Eclipse代码自动补齐 设置

    Eclipse -> Perferences -> Java -> Editor -> Content Assist如下图. 将auto activation triggers ...

  5. jemalloc内存分配原理【转】

    原文:http://www.cnblogs.com/gaoxing/p/4253833.html 内存分配是面向虚拟内存的而言的,以页为单位进行管理的,页的大小一般为4kb,当在堆里创建一个对象时(小 ...

  6. BigDecimal代码示例

    在平常开发中,如果涉及到计算,要求准确的精度,比如单价*数量=总价之类的计算,那么得用到BigDecimal. 初始化 如下: BigDecimal amount=new BigDecimal(&qu ...

  7. 二叉树 B-树B+树

    聚集索引和非聚集索引结构参考:http://blog.csdn.net/cangchen/article/details/44818623 前两天有位朋友邀请我回答个问题,为什么 MongoDB (索 ...

  8. Java编程思想之四控制执行流程

    程序必须再执行过程中控制它的世界,并做出选择.在Java中,你要使用执行控制语句来做出选择. 4.1true和false 所有条件语句都利用条件表达式的真或假来决定执行路径. Java不允许使用数字作 ...

  9. 敏捷项目管理—Scrum框架总结

    Scrum中的角色 Scrum Master——项目负责人.项目经理 保护团队不受外界干扰,是团队的领导和推进者,负责提升 Scrum 团队的工作效率,控制 Scrum 中的“检视和适应”周期过程.与 ...

  10. yum 安装指定版本Docker

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明.本文链接:https://blog.csdn.net/weixin_39553910/artic ...