视图函数必需要返回一个HttpResponse对象html
django
一、序列化字典对象,对象中要是有非ASCII码的字符须要将JSONResponse对象中的json_dumps_params = {'ensure_ascii': False} 默认为True变为Falsejson
from django.http import JsonResponse user_dic = {'username':"Mr沈", 'password':'123'} return JsonResponse(user_dic, json_dumps_params={'ensure_ascii': False})
二、序列化非字典格式数据,须要将safe改成False后端
from django.http import JsonResponse l1 = [1,2,3,4,5] return JsonResponse(l1, safe=False)
HTML文件中经过method='post' 和 enctype="multipart/form-data"让用户提交数据框架
<form action="" method="post" enctype="multipart/form-data"> <input type="file" name="myfile"> <input type="submit"> </form>
后端视图层能够经过request.FILES获取文件数据函数
def home(request): if request.method == 'POST': # 获取用户上传的文件数据 print(request.FILES) file_obj = request.FILES.get('myfile') # 文件句柄 print(file_obj.name) # 获取文件名 with open(file_obj.name,'wb') as f: for line in file_obj: f.write(line) return render(request,'home.html')
from django.template import Template, Context def re_render(request): tem = Template('<h1>{{ user_dic }}{{ user_dic.username }}</h1>') user_dic = Context({'user_dic': {'username': 'vicky', 'password': 123}}) res = tem.render(user_dic) return HttpResponse(res)
视图函数不必定就是一个函数,也能够是一个类post
FBV:基于函数的视图,直接在视图层写的函数url
CBV:基于类的视图,在视图层写类spa
一、首先在路由层中与视图函数对应关系应该调用类方法as_view()code
url(r'^login/', views.MyLogin.as_view())
二、在视图层中,调用View模块,使定义的类继承该模块,在该类下写全部的请求方式方法
from django.views import View class MyLogin(View): def get(self, request): return render(request, 'login.html') def post(self, request): return HttpResponse('收到post请求')
类中的方法as_view()可以自动识别提交的是什么请求执行MyLogin中的get或post方法
为何调用as_view方法就能自动执行对应的方法呢?咱们讲究须要看CBV源码了
一、首先as_view是由类来调用的,咱们猜测是普通的函数静态方法 @staticmethod 或者是类的绑定方法 @classmethod 看源码发现是类的绑定方法
二、因此执行url就至关于执行view函数,接下来咱们来看view函数干了什么
三、咱们要肯定self是咱们本身写的类产生的对象,cls就是咱们本身写的类,所以最后返回的self.dispatch会先从咱们本身写的类的对象中查找,再从咱们本身写的类中查找,若是没有再从继承的父类View中查找dispatch
四、最后咱们得出dispatch就是分发不一样的请求方式到咱们本身写的类的对应的方法,从而执行对应的方法
总结:as_view()返回的结果是 ---> view,view()函数返回的结果是 ---> dispatch(),在dispatch中进行获取反射获取请求方式,从而调用咱们自定义的类中的对应的方法,因此能够自动识别提交的是什么请求执行MyLogin中的对应的方法
Django有暴露给用户的settings配置文件和内部本身默认的配置,咱们须要看内部默认的配置时,首先在settings文件中导入global_settings和settings查看内部默认的配置
from django.conf import global_settings, settings
点击settings进入源码进入此页面可获得
能够经过字符串路径来获取路径中的属性和方法
import importlib res = 'conf.b' md = importlib.import_module(res) # 此方法获取到对象 # 该方法最小单位是模块 不能是模块里面的单个名字 print(md.name)
总结:用户配置了就用用户的,用户没有配置就用默认的配置
手动模拟Django配置文件所作的事
import importlib import os from lib.conf import global_settings class Settings(object): def __init__(self): # 先循环遍历项目默认的全局配置文件 for name in dir(global_settings): # 判断变量名是不是大写 if name.isupper(): # 键值对设置给对象 k = name # NAME v = getattr(global_settings,name) # jason setattr(self,k,v) # 先获取暴露给用户的配置文件的字符串路径 module_path = os.environ.get('xxx') # conf.settings # 里面importlib模块 导入settings文件 md = importlib.import_module(module_path) # md = settings # 同上操做 for name in dir(md): # 判断变量名是不是大写 if name.isupper(): # 键值对设置给对象 k = name # NAME v = getattr(md,name) # jason setattr(self,k,v) settings = Settings()