django初步了解3
JsonResponse模块
通过此模块,若不设置参数,则会把中文转成二进制,所以就需要设置参数ensure_ascii了
def index(request):
user = {'username':'jason真帅 我好喜欢哦~','pwd':'123'}
# json_str = json.dumps(user,ensure_ascii=False)
# return HttpResponse(json_str)
return JsonResponse(user,json_dumps_params={'ensure_ascii':False})
# l = [1,2,3,4,5,5,6]
# return JsonResponse(l,safe=False)
# JsonResponse默认只支持序列化字典 如果你想序列化其他类型(json能够支持的类型) 你需要将safe参数由默认的True改成False
需要注意的是转字典意外的其他格式,需设置safe参数!!!
额外赠品?
额外赠品?
额外赠品?
import json
from datetime import datetime
"""
TypeError: Object of type 'datetime' is not JSON serializable
"""
class MyJsonClass(json.JSONEncoder):
def default(self, o):
if isinstance(o,datetime): # 如果o不是json默认能够序列化 你就在该方法内给他处理成json能够转的类型
return o.strftime('%Y-%m-%d')
else:
super().default(self,o)
d = {'ctime':datetime.today()}
print(json.dumps(d,cls=MyJsonClass))
这里是用json模块来转json不支持的数据类型。。。将就着看吧
form表单上传文件
如果直接上传,用post的方式不设置其他参数,则只会上传文件名字,解决方法就是,在前段form表单处设置属性enctype=“formdata”。
做到这里时你以为成功了吗?
不,当你打印request.POST时发现连文件名都没了???
其实当设置了之后,文件就会以另一种方式上传,打印request.FILES你就会看见它
def up(request):
if request.method == 'POST':
print(request.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: # file_obj你可以直接看成文件句柄f
for chunk in file_obj.chunks(): # file_obj你可以直接看成文件句柄f(官方推荐下面这么写,其实没差别)
f.write(chunk)
return render(request,'up.html')
FBV与CBV
FBV(Function Based View) 基于函数的视图
CBV(Class Based View) 基于类的视图
CBV路由:
url(r'^reg/',views.MyReg.as_view())
思考一下?
你在类中写了两个方法 一个叫get一个叫post
为什么前端get请求来就会触发get方法
post请求来就会触发post方法 如何实现的???
源码分析开始了!
源码分析开始了!
源码分析开始了!
@classonlymethod
def as_view(cls, **initkwargs):
def view(request, *args, **kwargs):
self = cls(**initkwargs) # cls就是我们自己的写的MyReg类
if hasattr(self, 'get') and not hasattr(self, 'head'):
self.head = self.get
self.request = request
self.args = args
self.kwargs = kwargs
# 上面的一通操作 就是给我们自己写的类的对象赋值
return self.dispatch(request, *args, **kwargs)
# 对象在查找属性或方法的时候 顺序是什么? 先从自己找 再从产生对象的类中找 再去类的父类中找...
"""也就意味着你在看源码的时候 你一定要牢记上面的话"""
return view
先看看这段源码,从as_view()按ctrl点进去。很明显这是个闭包函数,最终返回一个view对象,所以接下来看view方法,if后面4行这是在赋值类似于初始化,因为self = cls(**initkwargs)建了一个新的对象,cls则是我们在视图中写的类,赋值后执行dispatch方法,很明显,接下来就是点进这个方法中看源码...
"""CBV最精髓的部分"""
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)
# handler = getattr(自己写的类产生的对象,'小写的请求方法(get\post)','获取不到对应的方法就报错')
# handler就是我们自己定义的跟请求方法相对应的方法的函数内存地址
else:
handler = self.http_method_not_allowed
return handler(request, *args, **kwargs) # 在调用获取到的方法
这个方法就是关键所在了,先判断方法是否符合规则,然后利用反射直接调用,简单粗暴-。-
django settings源码分析及实际应用
后续补更ing...
模板语法
模板传值
传函数名的时候 会自动加括号调用函数 将函数的返回值展示在html页面上
1.django模板语法不支持函数传参
2.django模板语法在获取容器类型内部元素的值的时候 统一只采用 句点符(.)
模板过滤器
过滤器 有点类似于小的方法
特点 会将|左边的当做过滤器的第一个参数 |右边的当前过滤器第二个参数
#add过滤器,结果是两个参数相加
<p>{{ n|add:100 }}</p>
<p>{{ n|add:'abc' }}</p>
<p>{{ s|add:'sasahhdasda' }}</p>
#length过滤器,取长度
<p>{{ l|length }}</p>
<p>{{ d|length }}</p>
#filesizeformat过滤器取文件长度
<p>{{ file_size|filesizeformat }}</p>
#truncatechars截取一定数量的字符
<p>截取10个字符 三个点也算{{ w1|truncatechars:10 }}</p>
<p>截取10个字符 三个点也算{{ w|truncatechars:10 }}</p>
#truncatewords截取指定限制条件和数量的字符
<p>按空格截取单词 三个点不算{{ w1|truncatewords:6 }}</p>
<p>按空格截取单词 三个点不算{{ w|truncatewords:6 }}</p>
<p>按空格截取单词 三个点不算{{ w2|truncatewords:6 }}</p>
#slice切片
<p>{{ l|slice:'0:5' }}</p>
<p>{{ l|slice:'0:5:2' }}</p>
#date日期输出格式
<p>{{ ctime|date:'Y-m-d' }}</p>
<p>{{ ctime|date:'Y年/m月' }}</p>
#safe让标签变得能被解释
<p>{{ sss|safe }}</p>
<p>{{ sss1|safe }}</p>
<p>{{ res }}</p>
#default无值则取默认值
<p>{{ xo|default:'' }}
有值就拿值 没值就用后面默认的
</p>
标签
if标签
{% if xo %}
<p>xo有值</p>
{% else %}
<p>xo没有值</p>
{% endif %}
{% if xo %}
<p>xo有值</p>
{% elif xo1 %}
<p>xo1有值</p>
{% else %}
<p>去他大爷的</p>
{% endif %}
for标签
{% for foo in l %}
{% if forloop.first %}
<p>这是我的第一次</p>
{% elif forloop.last %}
<p>这是最后一次了啊</p>
{% else %}
<p>嗨起来 大宝贝~</p>
{% endif %}
{% endfor %}
{% for foo in xo %}
<p>{{ forloop.counter }}:{{ foo }}</p>
{% empty %}判断是否为空
<p>你给我的对象是个空的没法进行for循环</p>
{% endfor %}
with标签
<p>{{ yyy.user_list.2.username.1 }}</p>
{% with yyy.user_list.2.username.1 as dsb %}
<p>{{ dsb }}</p>
<p>{{ yyy.user_list.2.username.1 }}</p>
{% endwith %}
自定义过滤器和标签
步骤:
1.在应用名下面创建一个叫templatetags的文件夹
2.在该文件夹中任意建一个py文件
3.在py文件中先固定写两行代码
from django.tempalte import Library
register = Libyary()
自定义
@register.filter(name='myplus')
def index(a,b):
return a + b
@register.simple_tag(name='mysm')
def login(a,b,c,d):
return '%s/%s/%s/%s'%(a,b,c,d)
区别 标签不能再if中使用
{% if 0|myplus:123 %} 可以用
<p>有值</p>
{% endif %}
{% if mysm 1 2 3 4 %} 不能用
<p>有值</p>
{% endif %}
模板继承
事先需要再模板中 通过block划定区域
{% block 区域名字 %}
{% endblock %}
子板中如何使用
{% extends '模板的名字'%}
{% block 区域名字 %}
<h1>登录页面</h1>
{% endblock %}
一个页面上 block块越多 页面的扩展性越高
通常情况下 都应该有三片区域
{% block css %}
{% endblock %}
{% block content %}
{% endblock %}
{% block js %}
{% endblock %}
子板中还可以通过
{{ block.super }} 来继续使用母版的内容
模板导入
当你写了一个特别好看的form表单 你想再多个页面上都使用这个form表单
你就可以将你写的form表单当作模块的形式导入 导入过来之后 就可以直接展示
{% include 'good_page.html' %}
django初步了解3的更多相关文章
- django初步了解2
目录 django初步了解2 表的字段增删改查 数据的增删改查 反向解析和分组 路由分发 名称空间 伪静态 虚拟环境 django初步了解2 表的字段增删改查 新增的字段 1.直接提供默认值 defa ...
- django初步了解
目录 学前了解 wsgiref模块( web服务网关接口) 根据不同的功能拆封成不同的py文件 动静态网页 HTTP协议 django初步了解1 1.小白必会三板斧 2.静态文件配置 3.reques ...
- Django初步(一):安装和简单演示
参考:Windows下安装Django:http://www.th7.cn/Program/Python/201305/136301.shtml
- django初步了解4
django单表查询 必知必会13条 1.all() 查询所有 QuerySet res=models.Book.objects.all()#惰性查询 print(res) for i in res: ...
- Django初步完成:登录、注册、退出
python环境:python2.7 开发工具:pycharm 项目名称:mysite5 app名称:online settings:映射app路径 INSTALLED_APPS = [ 'djang ...
- django初步--+urls解析
1.静态文件配置: 你在浏览器中输入网址能够有响应的资源返回给你 是因为后端已经提前给你开设该资源的接口,也就意味着你所能 访问到的资源 都是人家事先定义好的. 2.django如何给用户开设资源接口 ...
- django初步了解(一)
安装django pip3 install django==版本号 创建一个djangp项目 django-admin startproject 项目名 目录介绍: 运行django项目: pytho ...
- Django初步皮毛
Django是一个用python编写的Web框架. #Django安装 pip install Django 然后是配置环境变量,将这目录添加到系统环境变量中: C:\Python33\Lib\sit ...
- Django初识
web框架 Web应用框架有助于减轻网页开发时共通性活动的工作负荷,例如许多框架提供数据库访问接口.标准样板以及会话管理等,可提升代码的可再用性.简单地说,就是你用别人搭建好的舞台来做表演,用别人做好 ...
随机推荐
- javascript数据结构之顺序表
关于线性表的概念这里就不赘述了,可以自行百度和查阅资料,线性表按照存储(物理)结构分为顺序存储和链式存储,每种存储方式的不同决定了它的实现代码是不同的: 顺序存储的特点就是在内存中选一块连续的地址空间 ...
- D. Shortest Cycle(floyd最小环)
D. Shortest Cycle time limit per test 1 second memory limit per test 256 megabytes input standard in ...
- mysql的count和sum使用条件表达式
count函数条件不为null的时候显示结果.即使为false也也会显示结果. 可以是使用if条件或者case when语句.如果条件不为null即需要的结果. 使用count()函数实现条件统计的基 ...
- 20182303 2019-2020-1 《数据结构与面向对象程序设计》第2&3周学习总结
目录 教材学习内容总结 教材学习中的问题和解决过程 代码调试中的问题和解决过程 代码托管 上周考试错题总结 结对及互评 点评 学习进度条 教材学习内容总结 教材第二章内容 学习Java基本数据类型以及 ...
- CDN之Web Cache
1. Cache 的工作方式 Web Cache 作为一种网页缓存技术,可以在用户访问网站服务器的任何一个中间网元上实现.根据 HTTP 协议的定义,在一次网页访问中,用户从客户端发出请求到网站服务器 ...
- tensorflow feeddict问题unhashable type: 'numpy.ndarray'
https://stackoverflow.com/a/49134587 求argmax.加newaxis.转变data类型时尽量用tf自带的函数: tf.argmax.[tf.newaxis, :] ...
- HearthBuddy Magnetic 磁力
https://hearthstone.gamepedia.com/Magnetic Magnetic is an ability exclusive to certain Mech minions ...
- nginx 错误集锦
1)下载地址 http://nginx.org/en/download.html 找windows的下载. 2)然后解压到自己的一个目录. 3)配置环境变量,将解压到的路径加进去. 4)修改配置文件 ...
- ThinkPHP数据查询与添加语句
在ThinkPHP框架中实现数据的查询操作 function ShowAll() { //Model:数据库中每张表对应一个模型 //类名是表名,类里面的成员变量是列名 //把一张表对应一个类,其中一 ...
- [go]结构体/接口
接口惯用操作: 结构体构造方法返回接口类型 //定义服务器接口 type IServer interface{ Start() Stop() Serve() } type Server struct ...