视图层

一、视图函数

一个视图函数,简称视图,是一个简单的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'
用户如果配置了就用用户的
用户如果没有配置就用系统默认的
其实本质就是利用字典的键存在就是替换的原理 实现了用户配置就用用户的用户没配置就用默认的

最新文章

  1. Activiti开发环境配置
  2. 【CSS3】 线性渐变
  3. MyBatis(3.2.3) - Dynamic SQL
  4. 【EF】 proxy
  5. Windows Live Writer 代码插件改造
  6. hdu 5015 233 Matrix(构造矩阵)
  7. android详细信息java.util.ConcurrentModificationException变态
  8. MySQL中的基本知识
  9. ubuntu安装pycharm桌面快捷方式
  10. PAT乙级-1047. 编程团体赛(20)
  11. Android JNI 学习(七):Accessing Fields Api
  12. 【转载】使用Jquery操作Cookie对象
  13. Parsing Natural Scenes and Natural Language with Recursive Neural Networks-paper
  14. 【Spark调优】数据本地化与参数调优
  15. 【第十九章】 springboot + hystrix(1)
  16. Android Fragment 替代方案
  17. flask配置日志输出文件
  18. 将DHT11移植到Linux系统上(转)
  19. email的传输协议与格式(资源链接)
  20. Apache Thrift使用简介

热门文章

  1. 关于api创建监控项,添加灵活调度的事件间隔
  2. 一起学Makefile(二)
  3. 在itop4412移植linux4.14和设备树遇到的问题及解决
  4. SpringSecurity匿名用户访问权限
  5. Vs2017添加.NET Standard项目出现黄色未引用的SDK
  6. select多选左移右移的实现
  7. Netty通信网络参数配置
  8. php 面试必备:各种缓存技术详解
  9. 解决vue视图不渲染
  10. C++ 函数模板print