python之django基础ss

大家一起进步,感谢大家的支持和关注


#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()

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值