模型:
1
2
3
4
5
6
7
urls : 所有的映射
templates 模板 : 里面放的才是视图 - 子文件夹 - 模板页
控制器接收用户的请求与输入 - 对模型进行增删改查 - 把最后操作的结果显示出来
控制器(视图函数)作用 :
1.接收和验证用户的输入
2.对模型进行CRUD(增删改查)的操作 - 这里不用写SQL语句, 直接使用django的ORM框架(自动发SQL语句)进行面向对象的操作 - 自己所要做的就是定义好模型
3.为用户生成(渲染)视图
templates模板配置:
1
'DIRS': [os.path.join(BASE_DIR, 'templates')],
static静态资源配置:
1
2
3
css/js/images
STATICFILES_DIRS = [os.path.join(BASE_DIR, 'static')]
STATIC_URL = '/static/' # 浏览器访问静态资源的路径清晰 /static/images/1.jpg : 可以看到图片
本地MySQL安装流程 :
1
2
启动mysql57服务 : net start mysql57
或者计算机右键 - 管理 - 服务 - 手动启mysql57
运行后

自定义安装

根据个人系统选择

是否缺失

安装成功界面

集群

开发配置

创建用户

启服务

下一步

高级配置日志

执行口令

类与类 :
1
2
3
4
5
6
7
8
9
10
类与类之间的关系 :
is-a - 继承(学生是人, 人是动物)
has-a - 关联(聚合/合成)(老板有一辆汽车)(学生有电脑) - 一个类的属性又是另一个类的对象 - 强关联(引擎是车的一部分)
use-a - 依赖(我使用了这个水杯) - 对象方法的参数或返回值是另一个对象
class Person(object):
def miehuo(meihuoqi):
pass
def buy_house():
return House()
对象与对象之间的关系:
映射:
1
2
Django框架中包含了ORM(对象关系映射)框架
ORM可以帮助我们完成对象模型到关系模型的双向转换
函数:
1
2
3
4
5
6
整个页面加载完成后的回调函数:
$(function() {
# 绑定事件
# ajax请求

});

一对一是一对多的特例 : unique=True / OneToOne

实际开发中多对多会转换成 两个一对多关系

提示中 : m表示方法, f表示属性

用户看到空白页 = 违反最小惊讶原则

因特网 : 基于tcp/ip协议构建的网络

互联网 : 什么协议都可以

总结 :
1
2
3
4
5
6
7
知识点一 : 模型一对多外键关联

知识点二 : 请求视图函数时往里面传参

知识点三 : 利用ORM框架 - 通过学科反查老师, 如果禁用反查应该怎么写 - 用学科编号查老师

知识点四 : 如果请求不是页面请求, ajax, json 好评/差评 - a标签绑定事件源

编程大师 - 马丁富乐 - 代码的坏味道 - 重复是最坏的味道

完整路径 : get_full_path

路径

注 : s为路径 / 多个url可以对应到一个视图
CSRF - 跨站身份伪造 :

CSRF

避免跨站身份伪造 : 加入令牌 - {csrf_token}
1
2
3
4
好处 :
1.防止跨站身份伪造
2.防止网络重放攻击
3.防止表单重复提交
sha1摘要 - 算法 / md5算法 :
1
2
3
4
5
6
7
哈希码 - 数字摘要 - 数字指纹 - 数字签名
密码原文 --- 单向哈希函数 ---> 摘要(不用存明文)
MD5 : 长度 - 128bit
SHA1 : 长度 - 160bit
SHA256: 长度 - 256bit
SHA512 : 长度 - 512bit
百度云盘 : 秒传 - 根本没有上传 - 只是上传了一个摘要 - 服务器上有这个资源
生成摘要 :

生成摘要

创建对象 - 底层分配内存 - 复制对象(内存拷贝) - python底层用C语言写得

面向对象七个设计原则 :
1
2
3
4
5
6
7
1.单一职责原则
2.开闭原则
3.依赖倒转原则
4.里氏替换原则
5.接口隔离原则
6.合成聚合复用原则
7.迪米特法则
表单:
1
wiget小组件 - 指表单中的表单控件
ORM :
1
2
3
4
5
6
拿到集合 - 拿到指定主键的老师 - :冒号后面的内容就用到了ORM框架
ctx = {'teachers_list': list(Teacher.objects.all())}

# 自定义模型Teacher一定要继承models - 才能使用ORM框架
# Django框架中包含了ORM(对象关系映射)框架
# ORM可以帮助我们完成对象模型到关系模型的双向转换
1
2
3
4
5
6
7
8
9
10
11
# 因为HTTP协议本身是一个无状态协议(不能在两次请求之间保存用户的相关信息)
,所以服务器为了实现用户跟踪(收到请求时要识别是不是之前访问过的用户)就要使用其他的辅助方式
# 目前实现用户跟踪最常用的手段是使用Cookie(保存在浏览器中的临时数据)
# 我们在Cookie中可以保存一个sessionid(用户跟服务器进行会话的唯一标识)
# 每次浏览器向服务器发送HTTP请求时会在请求头中携带Cookie(也就是携带了sessionid)
# 服务器通过sessionid就可以确定请求来自于之前访问过服务器的哪个用户
# 如果浏览器发起的请求中没有Cookie或者Cookie中没有sessionid的信息,那么服务器会认为这是一个新的请求那么会给新的请求分配sessionid并将其写入浏览器
# 对于新的请求服务器会分配sessionid并将其写入浏览器的Cookie中
# 在默认情况下Djanngo对session做了持久化(保存在django_session表中)
# 如果要清理django_session表中过期的会话数据可以执行下面的命令 :
python manage.py clearsessions
设置会话:
1
2
3
4
5
6
7
8
9
10
# 设置是否在关闭浏览器窗口时让会话过期()
# 如果设置为True表示Cookie是基于浏览器窗口的而不是持久化的
# 只要浏览器窗口一关闭Cookie就自动消失了(没有持久化)

SESSION_EXPIRE_AT_BROWSER_CLOSE = False

# Cookie的过期时间(以秒为单位)
# Django框架默认的

SESSION_COOKIE_AGE = 1800
1 + n 查询问题 :
1
2
3
select_related('subject')方法将1 + n --> 连查
解决 :
连查
配置已安装的应用 :
1
2
3
4
5
6
7
8
9
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'应用名(APP)',
]
中间件:
1
2
3
4
5
6
7
8
9
MIDDLEWARE = [
'django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
]
配置模板 :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [os.path.join(BASE_DIR, 'templates')], # 配置路径
'APP_DIRS': True,
'OPTIONS': {
'context_processors': [
'django.template.context_processors.debug',
'django.template.context_processors.request',
'django.contrib.auth.context_processors.auth',
'django.contrib.messages.context_processors.messages',
],
},
},
]
配置数据库 :
1
2
3
4
5
6
7
8
9
10
11
DATABASES = {
'default': {
# 引擎 ENGINE
'ENGINE': 'django.db.backends.mysql', # 数据库类型
'NAME': '应用名',
'HOST': '阿里云或者本地数据库',
'PORT': 端口号,
'USER': '超级用户',
'PASSWORD': '密码',
}
}
语言与时区设置 :
1
2
3
4
5
6
7
8
9
10
11
LANGUAGE_CODE = 'zh-hans'

TIME_ZONE = 'Asia/Chongqing'

# 国际化 - internationalization
USE_I18N = True

# 本地化 - localization
USE_L10N = True

USE_TZ = True
序列化设置 :
1
2
3
4
# 序列化 - 把对象写入数据流 - 串行化 / 归档 / 腌咸菜
# 反序列化 - 从数据流中恢复出对象 - 反串行化 / 解归档
# Python有三个支持序列化的模块 :
# json - JSON / pickle - 二进制 / shelve
1
2
3
4
# 设置Django框架Session序列化的方式为PickleSerializer
# 从Django 1.6开始Django框架默认的序列化方式是JsonSerialization

SESSION_SERIALIZER = 'django.contrib.sessions.serializers.PickleSerializer'
静态资源设置 :
1
2
3
4
5
6
7
# 配置静态资源的目录

STATICFILES_DIRS = [os.path.join(BASE_DIR, 'static')]

# 配置统一资源定位符

STATIC_URL = '/static/'
配置日志 :

可以配多个handlers

level : 日志级别(五级) - DEBUG < INFO < WARNING < ERROR < CRITICAL

项目上线日志级别配置 : WARNING 或者 ERROR

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 配置将日志输出到控制台日志级别为DEBUG(最详细的日志)
# DEBUG < INFO < WARNING < ERROR < CRITICAL
LOGGING = {
'version': 1,
'disable_existing_loggers': False,
'handlers': {
'console': {
'class': 'logging.StreamHandler',
},
},
'loggers': {
'django': {
'handlers': ['console'],
'level': os.getenv('DJANGO_LOG_LEVEL', 'DEBUG'),
},
},
}
子类重写父类方法 :
1
2
3
4
5
6
7
8
9
# save方法 - 子类继承父类时对方法进行子类重写父类方法(重点) - 在save时对密码进行摘要
def save(self, force_insert=False, force_update=False, using=None, update_fields=None):
# 外部创建一个对象 - 用时复制对象
hasher = proto.copy()
# 更新需要摘要的内容
hasher.update(self.password.encode('utf-8'))
# 拿到一个16进制形式的摘要
self.password = hasher.hexdigest()
super().save(force_insert, force_update, using, update_fields)
数据库中索引 : 建目录 - 加速查询

周末作业 : 车辆违章查询 - 添加违章记录 / 查询违章记录

最后更新: 2018年07月07日 10:09

原始链接: http://yoursite.com/2018/07/07/表单与Cookie与Settings/

× 请我吃糖~
打赏二维码