大家一起进步,感谢大家的支持和关注
django框架
#django框架
1.模板
1.1寻找html模板
setting.py中先配置
优先去项目根目录 > 每个已注册的app的templates目录找。
- 如何选择:
- 简单的项目,模板都放在根目录。
- 复杂的项目,模板放在各自的app中,公共部分放在templates目录。
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 模板处理的本质
渲染完成后,生成了字符串,再返回给浏览器
1.3 常用语法
注意循环和对象类型的取值
1.4内置函数
主要主要时间类型
1.5 自定义模板函数
在app下创建一个utils文件夹在创建一个py文件,里面放模板函数
三种方式:
-
filter
数据处理,参数:1~2个 数据处理,if条件
-
simple_tag
参数无限制 & 返回文本
-
inclusion_tag
参数无限制 & HTML片段
基于 inclusion_tag做生成不同权限的数据
1.6 继承和母版
1.7模板的导入
2. 中间件
自定义中间件
继承MiddlewareMixin
注册到settings中间件列表 注意顺序
- 类方法
- process_request
- process_view
- process_reponse
- process_exception,视图函数出现异常,自定义异常页面。
- process_template_response,视图函数返回
TemplateResponse
对象 or 对象中含有.render方法。
from django.utils.deprecation import MiddlewareMixin
from django.shortcuts import HttpResponse
class Middle1(MiddlewareMixin):
def process_request(self, requset):
print("进入中间件1")
# 也可以在这里拦截加return
# return HttpResponse("不可以访问")
def process_response(self, request, response):
print("出去中间件1")
# 必须有返回值response
return response
3.orm操作
-
熟悉mysql语句
- orm操作就是用python的语句去执行mysql语句
- python语句与mysql原生语句的对应
- 表结构非常重要
3.1过程
1.
创建数据库
这里用默认的可以不管
2.编写模型
3.执行命令
#生成一个对数据库操作的配置文件
=>migrations
python manage.py makemigrations
# 生成表结构
python manage.py migrate
4.看看app有没有注册
如果有问题就看这四步吧
5.连接默认数据库,后续可以改配置连接其他数据库
from django.db import models
class UserInfo(models.Model):
name = models.CharField(verbose_name="姓名", max_length=16, db_index=True)
age = models.PositiveIntegerField(verbose_name="年龄")
email = models.CharField(verbose_name="邮箱", max_length=128, unique=True)
amount = models.DecimalField(verbose_name="余额", max_digits=10, decimal_places=2, default=0)
register_date = models.DateField(verbose_name="注册时间", auto_now=True)
class Goods(models.Model):
title = models.CharField(verbose_name="标题", max_length=32)
detail = models.TextField(verbose_name="详细信息")
price = models.PositiveIntegerField(verbose_name="价格")
count = models.PositiveBigIntegerField(verbose_name="库存", default=0)
3.2 常见字段
CharField
SmallIntegerField
IntegerField
BigIntegerField
DateField
DateTimeField
BooleanField -> 其实数据库不支持真假,根据SmallIntegerField创造出来出来。 0 1
DecimalField -> 精确的小数
3.3 表关系
一对一
一对多
多对多
3.4 orm,关系对象映射。
类 --> SQL --> 表
对象 --> SQL --> 数据
3.5 编写ORM操作的步骤
就是上面的过程
编写ORM操作的步骤:
-
settings.py,连接数据库
DATABASES = { 'default': { 'ENGINE': 'django.db.backends.sqlite3', 'NAME': BASE_DIR / 'db.sqlite3', } }
-
settings.py,注册app
INSTALLED_APP = [ ... "app01.apps.App01Config" ]
-
编写models.类
class UserInfo(models.Model): .... .....
-
执行命令
python manage.py makemigrations # 找到所有已注册的app中的models.py中的类读取 -> migrations配置 python manage.py migrate # 读取已注册的app下的migrations配置 -> SQL语句 -> 同步数据库
4.连接其他数据库改配置
最基础配置
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'xxxxxxxx', # 数据库名字
'USER': 'root',
'PASSWORD': 'root123',
'HOST': '127.0.0.1', # ip
'PORT': 3306,
}
}
读写分离
DATABASES = {
'default': {#读
'ENGINE': 'django.db.backends.mysql',
'NAME': 'xxxxxxxx', # 数据库名字
'USER': 'root',
'PASSWORD': 'root123',
'HOST': '127.0.0.1', # ip
'PORT': 3306,
},
'xxx': {#写
'ENGINE': 'django.db.backends.mysql',
'NAME': 'xxxxxxxx', # 数据库名字
'USER': 'root',
'PASSWORD': 'root123',
'HOST': '127.0.0.1', # ip
'PORT': 3306,
}
}
安装第三方组件
-
pymysql
pip install pymysql
项目根目录/项目名目录/__init__.py import pymysql pymysql.install_as_MySQLdb()
-
mysqlclient
pip install mysqlclient
电脑上先提前安装MySQL。
基于连接池
pymysql -> 操作数据库
DBUtils -> 连接池
pip install django-db-connection-pool
DATABASES = {
"default": {
'ENGINE': 'dj_db_conn_pool.backends.mysql',
'NAME': 'xxx', # 数据库名字
'USER': 'root', #
'PASSWORD': '123', #
'HOST': '127.0.0.1', # ip
'PORT': 3306,
'POOL_OPTIONS': {
'POOL_SIZE': 10, # 最小
'MAX_OVERFLOW': 10, # 在最小的基础上,还可以增加10个,即:最大20个。
'RECYCLE': 24 * 60 * 60, # 连接可以被重复用多久,超过会重新创建,-1表示永久。
'TIMEOUT':30, # 池中没有连接最多等待的时间。
}
}
}
DATABASES = {
"default": {
'ENGINE': 'dj_db_conn_pool.backends.mysql',
'NAME': 'xxdb', # 数据库名字
'USER': 'root',
'PASSWORD': '123',
'HOST': '127.0.0.1', # ip
'PORT': 3306,
'POOL_OPTIONS': {
'POOL_SIZE': 10, # 最小
'MAX_OVERFLOW': 10, # 在最小的基础上,还可以增加10个,即:最大20个。
'RECYCLE': 24 * 60 * 60, # 连接可以被重复用多久,超过会重新创建,-1表示永久。
'TIMEOUT': 30, # 池中没有连接最多等待的时间。
}
},
"bak": {
'ENGINE': 'dj_db_conn_pool.backends.mysql',
'NAME': 'xxbak', # 数据库名字
'USER': 'root',
'PASSWORD': '123',
'HOST': '127.0.0.1', # ip
'PORT': 3306,
'POOL_OPTIONS': {
'POOL_SIZE': 10, # 最小
'MAX_OVERFLOW': 10, # 在最小的基础上,还可以增加10个,即:最大20个。
'RECYCLE': 24 * 60 * 60, # 连接可以被重复用多久,超过会重新创建,-1表示永久。
'TIMEOUT': 30, # 池中没有连接最多等待的时间。
}
},
}
-
生成数据库表
python manage.py makemigrations # 找到所有已注册的app中的models.py中的类读取 -> migrations配置 python manage.py migrate python manage.py migrate --database=default python manage.py migrate --database=bak
-
后续再进行开发时
models.UserInfo.objects.using("default").create(title="武沛齐") models.UserInfo.objects.using("bak").all()
-
编写router类,
class DemoRouter(object): def db_for_read(...): return "bak" def db_for_write(...): return "default"
router = ["DemoRouter"]
5 cookie和session
配置session
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',
]
# session
SESSION_ENGINE = 'django.contrib.sessions.backends.file'
SESSION_FILE_PATH = 'xxxx'
SESSION_COOKIE_NAME = "sid" # Session的cookie保存在浏览器上时的key,即:sessionid=随机字符串
SESSION_COOKIE_PATH = "/" # Session的cookie保存的路径
SESSION_COOKIE_DOMAIN = None # Session的cookie保存的域名
SESSION_COOKIE_SECURE = False # 是否Https传输cookie
SESSION_COOKIE_HTTPONLY = True # 是否Session的cookie只支持http传输
SESSION_COOKIE_AGE = 1209600 # Session的cookie失效日期(2周)
SESSION_EXPIRE_AT_BROWSER_CLOSE = False # 是否关闭浏览器使得Session过期
SESSION_SAVE_EVERY_REQUEST = True # 是否每次请求都保存Session,默认修改之后才保存
-
数据库
INSTALLED_APPS = [ # 'django.contrib.admin', # 'django.contrib.auth', # 'django.contrib.contenttypes', 'django.contrib.sessions', # 'django.contrib.messages', 'django.contrib.staticfiles', "app01.apps.App01Config", ] MIDDLEWARE = [ 'django.middleware.security.SecurityMiddleware', # 1 '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', ] #2 # session SESSION_ENGINE = 'django.contrib.sessions.backends.db' SESSION_COOKIE_NAME = "sid" # Session的cookie保存在浏览器上时的key,即:sessionid=随机字符串 SESSION_COOKIE_PATH = "/" # Session的cookie保存的路径 SESSION_COOKIE_DOMAIN = None # Session的cookie保存的域名 SESSION_COOKIE_SECURE = False # 是否Https传输cookie SESSION_COOKIE_HTTPONLY = True # 是否Session的cookie只支持http传输 SESSION_COOKIE_AGE = 1209600 # Session的cookie失效日期(2周) SESSION_EXPIRE_AT_BROWSER_CLOSE = False # 是否关闭浏览器使得Session过期 SESSION_SAVE_EVERY_REQUEST = True # 是否每次请求都保存Session,默认修改之后才保存
-
缓存
INSTALLED_APPS = [ # 'django.contrib.admin', # 'django.contrib.auth', # 'django.contrib.contenttypes', # 'django.contrib.sessions', # 'django.contrib.messages', 'django.contrib.staticfiles', "app01.apps.App01Config", ] 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', ] # session SESSION_ENGINE = 'django.contrib.sessions.backends.cache' SESSION_CACHE_ALIAS = 'default' SESSION_COOKIE_NAME = "sid" # Session的cookie保存在浏览器上时的key,即:sessionid=随机字符串 SESSION_COOKIE_PATH = "/" # Session的cookie保存的路径 SESSION_COOKIE_DOMAIN = None # Session的cookie保存的域名 SESSION_COOKIE_SECURE = False # 是否Https传输cookie SESSION_COOKIE_HTTPONLY = True # 是否Session的cookie只支持http传输 SESSION_COOKIE_AGE = 1209600 # Session的cookie失效日期(2周) SESSION_EXPIRE_AT_BROWSER_CLOSE = False # 是否关闭浏览器使得Session过期 SESSION_SAVE_EVERY_REQUEST = True # 是否每次请求都保存Session,默认修改之后才保存
缓存
-
服务器 + redis安装启动
-
django
-
安装连接redis包
pip install django-redis
-
settings.py
# 3 CACHES = { "default": { "BACKEND": "django_redis.cache.RedisCache", "LOCATION": "redis://127.0.0.1:6379", "OPTIONS": { "CLIENT_CLASS": "django_redis.client.DefaultClient", "CONNECTION_POOL_KWARGS": {"max_connections": 100} # "PASSWORD": "密码", } } }
6 手动操作redis
-
from django_redis import get_redis_connection
conn = get_redis_connection("default")
conn.set("xx","123123")
conn.get("xx")
7 手动操作mysql
# 导包
from pymysql import Connection
# 创建数据库连接
conn=Connection(
host='localhost', # 数据库主机地址
port=3306, # 端口,默认3306
user='username', # 数据库用户名
password='password', # 数据库密码
)
cursor = connection.cursor()
cursor.close()
conn,close()