# 视图函数必须返回一个HttpResponse对象
HttpResponse
class HttpResponse:
pass
render
def render(...):
return HttpResponse(...)
redirect
def redirect(...)
# redirect_class是HttpResponse子类
return redirect_class(...)
"""
前后端不分离
django写项目(前端直接使用模板层及模板语法)
前后端分离
django写项目(前端使用其他框架和语言)
不同编程语言之间如何交互???
json格式数据
python中如何序列化反序列化
dumps()
loads()
js中如何序列化反序列化
JSON.stringfy()
JSON.parse()
"""
import json
from django.http import JsonResponse
def index(request):
d = {'username': 'jason老师', 'pwd': 123, 'hobby': [111, 222, 333]}
l = [111,222,333,444,555]
# json_str = json.dumps(d) # 序列化默认会对中文字符做转码
# json_str = json.dumps(d,ensure_ascii=False) # 序列化默认会对中文字符做转码
# return HttpResponse(json_str)
# return JsonResponse(d, json_dumps_params={'ensure_ascii': False})
return JsonResponse(l,safe=False)
1.method必须是post
2.enctype参数必须是multipart/form-data
request.POST无法获取到文件类型的数据
request.FILES获取文件类型的数据
前端获取文件数据
<input type="file" name="file"> 只能获取一个
<input type="file" name="file" multiple> 可以一次性获取多个
后端获取文件数据
request.FILES.get()
request.FILES.getlist()
FBV 基于函数的视图
def index(request):
return HttpResponse(...)
CBV 基于类的视图
# 视图函数即可以是函数也可以是类
from django.views import View
class MyLogin(View):
def get(self, request):
return HttpResponse('get请求')
def post(self, request):
return HttpResponse('post请求')
url(r'^login/', views.MyLogin.as_view())
"""CBV会自动判断当前请求方法并自动匹配类中的方法执行"""
"""
函数名或者方法名遇到括号执行优先级最高
对象查找属性或方法的顺序
永远都是先从自己身上找
然后去产生对象的类中找
再去类的父类中找 如果都没有才会报错
闭包函数
定义在函数内部并且使用了外层函数名称空间中的名字
回去记得复习面向对象反射
"""
FBV与CBV在路由匹配上本质其实是一样的
都是正则表达式对应函数名
切入口为url对应关系:
url(r'^login/', views.MyLogin.as_view())
def as_view(cls, **initkwargs):
def view(request, *args, **kwargs):
# cls使我们自定义的类 MyLogin
self = cls(**initkwargs) # 产生一个MyLogin类的对象 obj
return self.dispatch(request, *args, **kwargs)
return view
def dispatch(self, request, *args, **kwargs):
if request.method.lower() in self.http_method_names: # 判断当前请求方法是否在八个方法内
handler = getattr(self, request.method.lower(), self.http_method_not_allowed)
else:
handler = self.http_method_not_allowed
return handler(request, *args, **kwargs)
如何给html文件传值
1.{}字典挨个指名道姓
节省系统资源
2.locals()全部传递
节省人力资源 # 学习阶段就使用这种方式
1.python基本数据类型全部支持模板语法传值
2.在django中模板语法取值只能使用一种方式(句点符.)
3.针对函数名模板语法传值之后会自动加括号执行将返回值渲染到页面上
4.针对类名和对象名模板语法传值之后都会先加括号调用
类名加括号会产生对象
对象加括号不符合正常的调用方式 还是对象本身
但是会触发产生该对象类中的__call__方法
"""
小总结
django模板语法不支持函数传参
当需要引用变量名的时候使用双大括号 {{}}
"""
{{}} # 跟变量名相关
{%%} # 跟功能逻辑相关
# 相当于python的内置函数
{#过滤器:(|) 将管道符左边的数据当做第一个参数传入过滤器中如果需要第二个参数 则名称后冒号
#}
<p>统计长度:{{ l|length }}</p>
<p>加法运算:{{ i|add:123 }}</p>
<p>默认值:{{ b|default:'布尔值为False' }}</p>
<p>时间格式:{{ ctime|date:'Y-m-d H:i:s' }}</p>
<p>截取字符(包含三个点):{{ ss|truncatechars:10 }}</p>
<p>截取单词(不包含三个点):{{ ss|truncatewords:3 }}</p>
<p>文件大小:{{ file_size|filesizeformat }}</p>
<p>转义:{{ s1|safe }}</p>
后端也可以转义
from django.utils.safestring import mark_safe
s2 = ""
res = mark_safe(s2)
<p>标签:其实就是流程控制 if判断 for循环</p>
{% for foo in s %}
{% if forloop.first %}
<p>这是第一次循环</p>
{% elif forloop.last %}
<p>这是最后一次</p>
{% else %}
<p>继续!!!</p>
{% endif %}
{% empty %}
<p>传递过来的数据是空的</p>
{% endfor %}