数据库同步
avatar = models.FileField(upload_to='avatar/',default='avatar/default.png')
is_up = models.BooleanField() # 传True/False 自动存成0/1
content = models.TextField() # 大段html内容
# 数据库优化字段(******)
comment_num = models.BigIntegerField(default=0)
up_num = models.BigIntegerField(default=0)
down_num = models.BigIntegerField(default=0)
parent = models.ForeignKey(to='self',null=True) # 自关联
1.注册功能
1.注册功能往往都会由很多校验性的需求 所以这里我们用到了forms组件
项目中可能有多个地方需要用到不同的forms组件 为了解耦合 但是创建一个py文件 专门用来存放项目用到的所有的forms组件
校验 用户名 密码 确认密码 邮箱
借助于钩子函数 校验用户名是否存在 密码与确认密码是否一致
2.创建路由 写视图函数
将实例化产生的forms类对象 利用模板语法传递到前端页面
再利用forms组件自动渲染前端获取用户输入的标签
3.用户输入数据后 采用ajax的方式朝后台提交数据
1.考虑到获取用户输入的input框可能会有很多 在同ajax获取的时候 可能会比较繁琐
借助了form标签有一个方法 自动将内部所有的普通键值 打包成一个容器类型
$('#myform').serializeArray()
2.你需要提交的数据不单单只有普通键值 还有文件 可以借助 内置对象 FormData
如何获取文件对象
$('#myfile')[0].files[0] # forms组件渲染错误的信息
4.用户头像前端动态展示
利用内置对象 文件阅读器 new FileReader
等待什么什么加载完毕再执行 onload
window.onload
fileReader.onload = function(){
文件阅读器加载完毕之后 再执行的操作
}
5.针对ajax提交的数据 后端在返回信息的时候 通常都是一个字典
在创建数据的时候利用**直接打散字典的形式 传输数据
6.将错误的信息传递给前端
前端渲染错误信息的时候 遇到了一个问题 如何将对应的信息渲染到对应的input框下面的span标签中
研究forms组件渲染的input框的id值的特点 id_字段名
发现后端传过来的字典的key就是一个个的字段名 自己拼接处id值
2.登录功能
1.前端页面搭建
图片验证码
2.图片验证码
img标签 src可以接收的数据
1.图片的具体路径
2.图片的二进制数据
3.后端url(自动朝该url发送get请求)
3.后端代码推导
操作图片的模块pillow
4.完成后跳转到网站首页
展示网站所有的博客内容
django
django是什么
web框架 django是一款专门用来开发app的web框架
框架 就是类似于提前帮你搭建好整个项目的基础架构
纯手撸的web框架
统一接口
先砸钱 先让用户对你这个软件产生依赖 然后你再慢慢的抽血
共享单车
HTTP协议 >>> sql语句
为什么要有HTTP协议 一个服务端要服务N多个不同的客户端 如何保证数据的正常交互
为什么要有sql语句 一个服务端要服务N多个不同的客户端 如何保证数据的正常交互
团队创业
web框架
django
flask
三行代码
tronado
自己去百度收一收
django版本问题
django == 1.11.11
requiretment.txt
django == 1.11.11
django == 1.11.11
django == 1.11.11
django == 1.11.11
django == 1.11.11
django == 1.11.11
django == 1.11.11
django == 1.11.11
django == 1.11.11
django基本操作命令
创建一个django项目
django-admin startproject 项目名
启动django项目
python manage.py runserver
创建应用(app01/app02) web option
python manage.py startapp 应用名
数据库迁移命令
python manage.py makemigrations
python manage.py migrate
# 报错 中文的问题
# 报错 django源码多了一个逗号
浏览器 >>> nignx + web服务网关接口(wsgiref,uwsgi) >>> 中间件(全局性的功能) >>> 路由层 >>> 视图层 >>> 模板层 + 模型层(ORM查询) + 数据库
web服务网关接口
django默认的是wsgiref
上线之后该用uwsgi
WSGI与wsgiref,uwsgif关系
前者是协议 后者是实现该协议的功能模块
请求到达django后端和响应离开django后端都必须结果中间件
django默认有七个中间件 并且支持用户自定义中间件
自定义中间件有五个可以自定义的方法
需要掌握
process_request
process_response
需要了解
process_view
process_exception
process_template_response
# 形参中有response的 一定要将该形参返回
# 写好的中间件 一定要在配置文件中注册
设计思想
importlib
反射
# 都是操作字符串
路由层
url(r'^index/',view.index)
1.路由匹配
url的第一个参数 是一个正则表达式
在匹配的时候 有一个特点 一旦匹配上了 会立刻停止匹配 执行路由对应的方法
2.无名分组(位置参数)
url(r'^index/(d+)',view.index)
3.有名分组(关键字参数)
url(r'^index/(?P<year>d+)',view.index)
4.反向解析
静态文件的配置
url(r'^index/',view.index,name='index') # 这个名字一定要是在整个django项目中唯一
{% url 'index' %}
reverse('index')
url(r'^index/(d+)',view.index)
{% url 'index' 1 %}
reverse('index',args=(1,)) # 容器类型 哪怕只有一个元素 你也习惯性的加一个逗号
url(r'^index/(?P<year>d+)',view.index)
{% url 'index' 1 %}
{% url 'index' year=1 %}
reverse('index',args=(1,)) # 容器类型 哪怕只有一个元素 你也习惯性的加一个逗号
reverse('index',kwargs={'year':1,}) # 容器类型 哪怕只有一个元素 你也习惯性的加一个逗号
5.路由分发(******)
include
url(r'^应用名1/',include('应用名1.urls'))
url(r'^应用名2/',include('应用名2.urls'))
6.名称空间
url(r'^应用名1/',include('应用名1.urls',namespace='应用名1'))
url(r'^应用名2/',include('应用名2.urls',namespace='应用名2')))
reverse('应用名1:别名')
reverse('应用名2:别名')
视图层
HttpResponse
render
redirect
JsonResponse
FBV与CBV
只要是视图函数 一般情况下都需要定义一个形参request
CBV的书写及内部原理
from django.views import View
class MyReg(View):
def get(self,request):
pass
def post(self,request):
pass
url(r'^index/',MyReg.as_view())
# url(r'^index/',view)
view里面
1.实例化产生自己写的类的对象
2.对象点dispatch方法
dispatch里面
1.先确认请求方式(默认八个)
2.反射获取方法的内存地址
3.加括号执行对应的方法
模型层
模板语法
变量相关 {{}}
逻辑相关 {%%}
1.过滤器
|length
|default
|add
|date
|filesizeformat
|slice
|truncatewords
|truncatechars
|safe
2.标签
{% if aaa %}
{% elif %}
{% else %}
{% endif %}
{% for %}
{{ forloop }}
{% endfor %}
{% with %}
{% endwith %}
3.自定义过滤器及标签
1.在应用中要键一个名字必须叫templatetags
2.任意名称的py文件
3.固定写两行代码
from django.template import Library
register = Library()
@register.filter
@register.simple_tag
4.模板的继承与导入
继承
模板中需要提前划定号区域
{% block '名字' %}
模板内容
{% endblock %}
子板中使用
{% extends '模板的名字'%}
{% block '名字' %}
子板内容
{{ super.block }}
{{ super.block }}
{{ super.block }}
{% endblock %}
模板的导入
{% include '模板名' %} # 类似于导入模块
模型层
查询语句
单表的查询
类名.objects.
必知必会13条
all()
filter()
get()
values()
values_list()
first()
last()
order_by()
reverse()
count()
exists()
distinct()
exclude()
神奇的双下划线
price__lt
__gt
__lte
__gte
__in
__range
title__startswith
__endswith
__contains
__icontains(******)
create_time__year
__month
外键字段的增删改查
一对多
create(publish=publish_obj)
create(publish_id=1)
# 默认是级联更新 级联删除
多对多
add()
add(1)
add(1,2)
add(author_obj)
add(author_obj,author_obj1)
remove()
# 同理
set()
set([1,])
set([1,2])
set([author_obj,])
set([author_obj,author_obj1])
clear()
跨表查询
正向查询按字段
反向查询按表名小写
基于对象的(子查询)
1.先获取一个对象
2.利用对象点点
book_obj.publish.name
book_obj.authors.all()
author_obj.author_detail.phone
publish_obj.book_set.all()
author_obj.book_set.all()
author_detail_obj.author.name
基于双下滑线(连表查询)
models.Book.objects.filter(pk=1).values('publish__name')
models.Book.objects.filter(pk=1).values('authors__name')
models.Book.objects.filter(pk=1).values('authors__author_detail__phone')
models.Publish.objects.filter(book__pk=1).values('name')
聚合查询
关键字 aggregate
from django.db.models import Avg, Max, Min, Sum, Count
分组查询
关键字 annotate
参考博客练习题
F与Q查询
F 能够获取表中的某个字段对应的数据
库存数大于卖出数的书
Q 能够改变查询条件
与 filter(**kwargs)
或 filter(Q(xxx='yyy')|Q(yyy='ooo'))
非 filter(~Q(xxx='ooo'))
ps:
q = Q()
q.connector = 'or'
q.children.append('xxx','ooo')
q.children.append('yyy','zzz')
filter(q)
只要你肯砸时间 什么技术你都能学会!!!
django与ajax
前后端传输数据的编码格式
urlencoded
username=jason&age=18
formdata
application/json
{"username":"jason"}
form表单
ajax(******)
ajax基本语法
$.ajax({
url:'',
type:'post',
data:{'name':'jason'}
success:function(data){
alert(data)
}
})
ajax提交json格式
data必须是json格式的数据
contentType需要指定成application/json
ajax提交文件格式
data直接写formdata对象
还需要指定两个参数为flase
contentType
processData
cookie与session
中间件
class User:
username
password
1 jason 123
2 egon 123
3 tank 123
4 oscar 123
class Permission:
title
url
1 查看用户 check_user/
2 增加用户 add_user/
3 编辑用户 edit_user/(d+)/
4 删除用户 delete_user/(d+)/
...
class User2Permission
user
permission
1 1 1
2 1 2
3 1 3
RBAC 基于角色的权限管理()
class User:
username
password
1 jason 123
2 egon 123
3 tank 123
4 oscar 123
class Role:
title
1 保安队长
2 保洁阿姨
3 CEO
4 管理员
class Permission:
title
url
1 查看用户 check_user/
2 增加用户 add_user/
3 编辑用户 edit_user/(d+)/
4 删除用户 delete_user/(d+)/
...
class User2Role
user
role
1 1 3
2 2 2
3 3 1
4 4 2
class Role2Permission
role
permission
1 3 1
2 3 2
3 3 3
4 3 4
白名单
黑名单