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的更多相关文章

  1. django初步了解2

    目录 django初步了解2 表的字段增删改查 数据的增删改查 反向解析和分组 路由分发 名称空间 伪静态 虚拟环境 django初步了解2 表的字段增删改查 新增的字段 1.直接提供默认值 defa ...

  2. django初步了解

    目录 学前了解 wsgiref模块( web服务网关接口) 根据不同的功能拆封成不同的py文件 动静态网页 HTTP协议 django初步了解1 1.小白必会三板斧 2.静态文件配置 3.reques ...

  3. Django初步(一):安装和简单演示

    参考:Windows下安装Django:http://www.th7.cn/Program/Python/201305/136301.shtml

  4. django初步了解4

    django单表查询 必知必会13条 1.all() 查询所有 QuerySet res=models.Book.objects.all()#惰性查询 print(res) for i in res: ...

  5. Django初步完成:登录、注册、退出

    python环境:python2.7 开发工具:pycharm 项目名称:mysite5 app名称:online settings:映射app路径 INSTALLED_APPS = [ 'djang ...

  6. django初步--+urls解析

    1.静态文件配置: 你在浏览器中输入网址能够有响应的资源返回给你 是因为后端已经提前给你开设该资源的接口,也就意味着你所能 访问到的资源 都是人家事先定义好的. 2.django如何给用户开设资源接口 ...

  7. django初步了解(一)

    安装django pip3 install django==版本号 创建一个djangp项目 django-admin startproject 项目名 目录介绍: 运行django项目: pytho ...

  8. Django初步皮毛

    Django是一个用python编写的Web框架. #Django安装 pip install Django 然后是配置环境变量,将这目录添加到系统环境变量中: C:\Python33\Lib\sit ...

  9. Django初识

    web框架 Web应用框架有助于减轻网页开发时共通性活动的工作负荷,例如许多框架提供数据库访问接口.标准样板以及会话管理等,可提升代码的可再用性.简单地说,就是你用别人搭建好的舞台来做表演,用别人做好 ...

随机推荐

  1. Flask-认识flask

    Python 现阶段三大主流Web框架 Django Tornado Flask 对比 百度百科 1.Django 主要特点是大而全,集成了很多组件,例如: Models Admin Form 等等, ...

  2. OpenGL 开发环境配置:Visual Studio 2017 + GLFW + GLEW

    Step1:Visual Studio 2017 Why 开发环境,后面编译GLFW 和 GLEW也要用 How 这里使用的是Visual Studio 2017的 Community 版本,直接官网 ...

  3. JavaWeb_(Hibernate框架)Hibernate论坛项目中多对多案例

    基于SSH论坛小型项目 传送门 用户和发帖进行举例 多对多关系:多个用户可以回复多个帖子 因此引入了一张回复表,用来保存用户id和帖子id CREATE TABLE `hforum`.`answer` ...

  4. Java基础_死锁、线程组、定时器Timer

    一.死锁问题: 死锁是这样一种情形:多个线程同时被阻塞,它们中的一个或者全部都在等待某个资源被释放.由于线程被无限期地阻塞,因此程序不可能正常终止. 比如,线程一需要第一把所,此时锁处于空闲状态,给了 ...

  5. 提高组刷题班 DAY 1 上午

    低仿机器人(robo,1s,64M) 题解 大模拟 代码 #include <cstdio> #include <cstring> #include <iostream& ...

  6. UTC ISO 8601

    如果时间在零时区,并恰好与协调世界时相同,那么(不加空格地)在时间最后加一个大写字母Z.Z是相对协调世界时时间0偏移的代号.如下午2点30分5秒表示为14:30:05Z或143005Z:只表示小时和分 ...

  7. [go]redis基本使用

    redis 数据结构操作 import ( "github.com/garyburd/redigo/redis" ) // set c, err := redis.Dial(&qu ...

  8. 012-数据结构-树形结构-哈希树[hashtree]、字典树[trietree]、后缀树

    一.哈希树概述 1.1..其他树背景 二叉排序树,平衡二叉树,红黑树等二叉排序树.在大数据量时树高很深,我们不断向下找寻值时会比较很多次.二叉排序树自身是有顺序结构的,每个结点除最小结点和最大结点外都 ...

  9. 用es6实现一个promsie

    Promise 使用方法:https://www.runoob.com/w3cnote/javascript-promise-object.html 直接上代码,相关的解释都在代码的注释里面,这里以m ...

  10. Jmeter使用实践- 基础介绍

    Jmeter使用实践- 基础介绍 随着市场上推出越来越多的测试工具,大家使用起来也比较盲目,就我个人而言,使用过LoadRunner和Jmeter 很多人倾向于LoadRunner,因为LR的功能更强 ...