模型:
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_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.迪米特法则
|
表单:
ORM :
1 2 3 4 5 6
| 拿到集合 - 拿到指定主键的老师 - :冒号后面的内容就用到了ORM框架 ctx = {'teachers_list': list(Teacher.objects.all())}
# 自定义模型Teacher一定要继承models - 才能使用ORM框架 # Django框架中包含了ORM(对象关系映射)框架 # ORM可以帮助我们完成对象模型到关系模型的双向转换
|
Cookie:
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)
|
数据库中索引 : 建目录 - 加速查询
周末作业 : 车辆违章查询 - 添加违章记录 / 查询违章记录