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. nginx实现动静分离的负载均衡集群

    实战: 一.源码编译安装nginx [root@tiandong63 ~]#yum groupinstall "Development Tools" "Developme ...

  2. UVA 11174 Stand in a Line,UVA 1436 Counting heaps —— (组合数的好题)

    这两个题的模型是有n个人,有若干的关系表示谁是谁的父亲,让他们进行排队,且父亲必须排在儿子前面(不一定相邻).求排列数. 我们假设s[i]是i这个节点,他们一家子的总个数(或者换句话说,等于他的子孙数 ...

  3. Configure vyatta

    Username: vyatta Password: vyatta 配置网卡: 编辑: configure 内部网络IP地址配置:192.168.0.1 set interfaces ethernet ...

  4. C# 7 .NET / CLR / Visual Studio version requirements

    C# 7 .NET / CLR / Visual Studio version requirements   You do NOT need to target .NET 4.6 and above, ...

  5. C#剪切生成高质量缩放图片

    /// <summary> /// 高质量缩放图片 /// </summary> /// <param name="OriginFilePath"&g ...

  6. go代理设置

    在Go 1.13中,我们可以通过GOPROXY来控制代理,以及通过GOPRIVATE控制私有库不走代理. 设置GOPROXY代理: go env -w GOPROXY=https://goproxy. ...

  7. linux centos6.5 环境下安装redis的过程

    过程还是挺折磨人的!谢谢许正同学一直耐心给我指导,虽然他也很忙.废话不多说: 首先,确保linux虚拟机联网: vm虚拟机>设置>Network Adapter 设置>网络配置设置成 ...

  8. mybatis一对多映射【班级与学生】

    1)如图 2)创建grades.sql和students.sql drop table students; drop table grades; create table grades( gid in ...

  9. 解决docker命令行终端显示不全的问题

    访问docker容器,vim编辑文件时总是无法展示文件内容 解决 sudo docker exec -it -e LINES=$(tput lines) -e COLUMNS=$(tput cols) ...

  10. PCL点云库(Point Cloud Library)简介

    博客转载自:http://www.pclcn.org/study/shownews.php?lang=cn&id=29 什么是PCL PCL(Point Cloud Library)是在吸收了 ...