1、django创建项目
1、创建命令:
1、虚拟环境下载django:pip install django==3.2
2、创建django项目:django-admin startproject my_login .
注意:后面当前项目名 + (.)
3、创建app:python manage.py startapp web
注意:如果创建多个app时:python manage.py startapp api apps/api
4、创建一些其他的文件:
1、static文件(存放项目用到的一些文件)
2、templates文件(存放一些模板(html))
3、utils文件(存放一些项目用到的方法,一般放在项目根目录)
2、Django配置文件操作
1、操作数据库
1、在models文件下创建数据库中表的类
2、执行命令:
快捷键:ctrl + alt +r
1、python manage.py makemigrations
# 找到所有已注册的app中的models.py中的类读取 -> migrations配置
2、python manage.py migrate
# 读取已注册的app下的migrations配置 -> SQL语句 -> 同步数据库
注意:1、创建完之后不能用其他方式修改表结构
2、在创建之前一定保证连接的数据库存在
3、也可以用离线脚本来创建数据(scripts):
代码如下:
import os
import sys
import django
from web import models
from utils.encrypt import md5
# base_dir = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
# print(base_dir)
# sys.path.append(base_dir)
# os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'order.settings')
# django.setup() # 伪造让django启动
# models.Admin.objects.create(name="admin", password=md5("admin123"), mobile=18050446666)
# models.Level.objects.create(title="vip",percent=80)
2、django操作数据库:
1、django默认的方式:
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': BASE_DIR / 'db.sqlite3',
}
}
2、django连接mysql:
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'xxxxxxxx', # 数据库名字
'USER': 'root',
'PASSWORD': 'root123',
'HOST': '127.0.0.1', # ip
'PORT': 3306,
}
}
注意:需要安装第三方组件:
1、安装第三方组件:pip install pymysql
2、项目根目录/项目名目录/__init__.py
import pymysql
pymysql.install_as_MySQLdb()
如图:
3、django操作其他数据库:
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.postgresql',
'NAME': 'mydatabase',
'USER': 'mydatabaseuser',
'PASSWORD': 'mypassword',
'HOST': '127.0.0.1',
'PORT': 5432,
}
}
# 需要 pip install psycopg2
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.oracle',
'NAME': "xxxx", # 库名
"USER": "xxxxx", # 用户名
"PASSWORD": "xxxxx", # 密码
"HOST": "127.0.0.1", # ip
"PORT": 1521, # 端口
}
}
# 需要 pip install cx-Oracle
4、连接池操作数据库:
1、pip install django-db-connection-pool
DATABASES = {
"default": {
'ENGINE': 'dj_db_conn_pool.backends.mysql',
'NAME': 'day04', # 数据库名字
'USER': 'root',
'PASSWORD': 'root123',
'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, # 池中没有连接最多等待的时间。
}
}
}
5、多数据库:
DATABASES = {
"default": {
'ENGINE': 'dj_db_conn_pool.backends.mysql',
'NAME': 'day05db', # 数据库名字
'USER': 'root',
'PASSWORD': 'root123',
'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': 'day05bak', # 数据库名字
'USER': 'root',
'PASSWORD': 'root123',
'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, # 池中没有连接最多等待的时间。
}
},
}
6、数据库读写分离:
注意:(两张库的数据一模一样,通过组件来同步)
1、生成数据库表
python manage.py makemigrations # 找到所有已注册的app中的models.py中的类读取 -> migrations配置
python manage.py migrate
python manage.py migrate --database=default (默认)
python manage.py migrate --database=bak
2、后续再进行开发时
models.UserInfo.objects.using("default").create(title="武沛齐")
models.UserInfo.objects.using("bak").all()
3、编写router类,简化【后续再进行开发时】
class DemoRouter(object):
def db_for_read(...):
return "bak"
def db_for_write(...):
return "default".
配置文件中设置:router = ["DemoRouter"]即:DATABASE_ROUTERS=["XXXXXX"]
1、可以控制读写分离到不同的数据库里,
2、也可以控制不同的表是读还是写(mode._meta.model_name==需要控制的数据表名)
7、数据库分库操作:
1、app01/models:
from django.db import models
class UserInfo(models.Model):
title = models.CharField(verbose_name="标题", max_length=32)
2、app02/models:
from django.db import models
class Role(models.Model):
title = models.CharField(verbose_name="标题", max_length=32)
3、命令:
python manage.py makemigrations
python manage.py migrate app01 --database=default
python manage.py migrate app02 --database=bak
操作:
from django.shortcuts import render, HttpResponse
from app01 import models as m1
from app02 import models as m2
def index(request):
# app01中的操作 -> default
v1 = m1.UserInfo.objects.all()
print(v1)
# app02中的操作 -> bak
v2 = m2.Role.objects.using('bak').all()
print(v2)
return HttpResponse("返回")
8、(单app)分库(命令默认不支持,需要借助router)
from django.shortcuts import render, HttpResponse
from app01 import models as m1
def index(request):
# app01中的操作 -> default
v1 = m1.UserInfo.objects.all()
print(v1)
# app01中的操作 -> bak
v2 = m1.Role.objects.using('bak').all()
print(v2)
return HttpResponse("返回")
借助的router如下:
9、cookie和session
2.2 配置session:
1、文件版:
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(必须要设置在setting)
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,默认修改之后才保存
2、数据库:
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(必须要设置在setting
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,默认修改之后才保存
3、缓存:
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(必须要设置在settings)
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,默认修改之后才保存
1、安装缓存:
-
服务器 + redis安装启动
-
pip install django-redis
-
配置
注意(要用到django_redis下面一定要配置)
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": "密码",
}
}
}
2、手动操作redis:
from django_redis import get_redis_connection
conn = get_redis_connection("default")
conn.set("xx","123123")
conn.get("xx")
3、腾讯云发送短信:
下载sdk:pip install tencentcloud-sdk-python -i https://pypi.tuna.tsinghua.edu.cn/simple
from tencentcloud.common import credential
from tencentcloud.sms.v20210111 import sms_client, models
def send_sms(mobile, sms_code):
mobile = "+86{}".format(mobile)
try:
cred = credential.Credential("AKIDuqhT8g1GUZQ8jJkFblohWEmFXdbbRCkE", "VotmSpb9SYQr776HLCrOn0eAXhkdIk9X")#key
# client = sms_client.SmsClient(cred, "ap-guangzhou")
client = sms_client.SmsClient(cred, "ap-guangzhou")
req = models.SendSmsRequest()
req.SmsSdkAppId = "1400855744"
req.SignName = "pyth小技巧个人公众号"#短信签名
req.TemplateId = "1934310"#短信模板
req.TemplateParamSet = [sms_code]#设置的验证码
req.PhoneNumberSet = [mobile, ]#电话
resp = client.SendSms(req)
print(resp.SendStatusSet)
data_object = resp.SendStatusSet[0]
# print(data_dict,type(data_dict))
# from tencentcloud.sms.v20210111.models import SendStatus
print(data_object.Code)
if data_object.Code == "Ok":
return True
except Exception as e:
print(e)
send_sms("18050449272","6666")
验证码和redis结合设置有效时间:
1、pip install redis
2、
conn = redis.Redis(host='127.0.0.1', port=6379, password='qwe123', encoding='utf-8')
# 短信验证码
conn.set('15131255089', 9999, ex=10)
value = conn.get('15131255089')
print(value)