Django框架之第四篇(视图层)--HttpRequest对象、HttpResponse对象、JsonResponse、CBV和FBV、文件上传、django settings源码分析
2020-12-29 11:28
标签:文件上传 html update sha importlib 标准 mylog 字符 input 视图层 一、视图函数 一个视图函数,简称视图,是一个简单的python函数,它接收web请求并且会返回web响应。响应可以是一张网页的html,一个重定向,或者是一张图片。。。 任何东西都可以。无论是什么逻辑,最后都必须要返回响应。 二、视图层之HttpRequest对象 django将请求报文中的请求行,首部信息,内容主题封装成HttpRequest类中的属性。除了特殊说明外,其他均为只读。 三、视图层之HttpResponse对象 响应对象主要有三种形式 django视图函数必须要返回一个HttpResponse对象 1 render() render结合一个html页面,并且还能通过字典给该页面传递数据,并返回一个渲染后的HttpResponse对象 render内部原理(?????????????????) 2.redirect() 传递需要重定向的url 3.HttpResponse() 四、视图层之JsonResponse对象 前端的json JSON.stringify() >>> json.dumps() JSON.parse() >>>> json.loads() 五、FBV和CBV FBV和CBV 视图函数并不只是指函数,也可以是类 FBV(基于函数的视图) 面向函数式编程 CBV(基于类的视图) 面向对象式编程 基于CBV的视图(get请求来就会走类里面的get方法,post请求来就会走类里面的post方法) 需要注意的几点设置: 1.urls.py 2.views.py(get请求就走get方法,post请求就走post方法) 基于FBV的视图 六、文件上传 form表单上传文件需要注意的事项 1.enctype需要由默认的urlencoded变成formdata 2.method需要由默认的get变成post (目前还需要考虑的是提交post请求需要将配置文件中的csrf中间件注释) 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 from django.conf import settings 从settings进入 Django框架之第四篇(视图层)--HttpRequest对象、HttpResponse对象、JsonResponse、CBV和FBV、文件上传、django settings源码分析 标签:文件上传 html update sha importlib 标准 mylog 字符 input 原文地址:https://www.cnblogs.com/ltyc/p/13806216.html
# 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 中的每个键为 中的name,值则为对应的数据。
# 注意,FILES 只有在请求的方法为POST 且提交的
HttpResponse()
render()
redirect()
return render(request,‘user_list.html‘,{‘user_lists‘:user_lists}) #‘user_lists‘传递给页面
第一个参数是用于生成相应的请求对象,第二个参数是使用的模板名称,第三个参数是传递到模板的数据
from django.template import Template,Context
def index(request):
temp = Template(‘
{{ user }}
‘)
con = Context({"user":{"name":‘jason‘,"password":‘123‘}})
res = temp.render(con)
print(res)
return HttpResponse(res)
def index(request):
return redirect(‘/index‘)
或者
return redirect reverse(‘index‘) #这里的index是取得别名
def test(request):
return HttpResponse(‘xxx‘) #页面显示xxx
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即可
url(r‘^login/‘,views.MyLogin.as_view())
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方法")
#路由层
url(r‘test/‘,views.test)
#视图层
def test(request):
return HttpResponse(‘test‘)
if __name__ == "__main__":
# django在启动的时候 就会往全局的大字典中设置一个键值对 值是暴露给用户的配置文件的路径字符串
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "day54.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、文件上传、django settings源码分析
文章链接:http://soscw.com/index.php/essay/39046.html