Note Book

发布时间 2023-12-09 12:47:09作者: 大-白

Day 3 Note Book

1.虚拟环境的安装

pip install virtualenv
#镜像安装
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple 安装包```文件
#例如更新pip
python -m pip install -i https://pypi.tuna.tsinghua.edu.cn/simple --upgrade pip

2.环境安装到 目录

windows r cmd
终端直接 d:
进入其他盘 cd /d d:

# cd 进入到目录下安装虚拟环境
virtualenv xxx --python=python3.9 注释“xxx”是环境名称 一般是与项目名字同名
#通过绝对路径安装
virtualenv xxx/xx/xxx/xx --python=python3.9
注意:用pycharm创建虚拟环境和项目是new一个python file,不是去new django项目。

django 安装命令

pip install django==3.2
cd 到目录
django-admin startproject 项目名称 .  创建项目 加点会加到根目录
python manage.py startapp app01 创建app01
python manage.py runserver 127.0.0.1:8000 启动项目
drf 安装
pip install djangorestframework
添加app
INSTALLED_APPS = [
    # 'django.contrib.admin',
    # 'django.contrib.auth',
    # 'django.contrib.contenttypes',
    # 'django.contrib.sessions',
    # 'django.contrib.messages',
    'django.contrib.staticfiles',
    'oderapp.apps.OderappConfig',
]
oderapp是自己创建的App,oderapp文件夹中apps中的OderappConfig  是一个函数的名字。
了解importlib
import importlib
path="111.222.333.444"
md=importlib.import_module(path)
print(md.age)

md2=getattr(md,"ch")
print(md2)

image-20230622102705623

了解isinstance
isinstance(obj, (list, tuple)) #判断isinstance  patterns 是列表还是元组,返回TRUE FLASE.
使用纯净版本django

image-20230708101647900

image-20230708101700560

正则表达式路由

  • 在django1版本用的多。
  • 在django2+版本用的少

假如:200个功能。

inlucde + app(一般),将功能拆分不到不同的app中。

1.在项目中创建一个apps
2.在apps文件夹创建app文件夹 比如有 api web....
3.终端运行 python manage.py startapp api apps/api  
4.找到api文件下的app中name进行修改
	class ApiConfig(AppConfig):
    default_auto_field = 'django.db.models.BigAutoField'
    name = 'apps.api'
    

image-20230824110414000

手动路由分发,可以与app无关。

path('user/add/', views.login),
path('user/delete/', views.login),
path('user/edit/', views.login),
path('user/list/', views.login),


path('user/', ([
                   path('add/', views.login),
                   path('delete/', views.login),   # /user/delete/
                   path('edit/', views.login),
                   path('list/', views.login),
               ], None, None)),

纯粹帮助提取功能的URL,防止重复编写。

小结

  • include或手动元组列表,本质相同。

  • 应用场景和意义,想要把一些URL前缀提取出来。

    path('user/add/', views.login),
    path('user/delete/', views.login),
    path('user/edit/', views.login),
    path('user/list/', views.login),
    
    
    path('user/', ([
                       path('add/', views.login),
                       path('delete/', views.login),   # /user/delete/
                       path('edit/', views.login),
                       path('list/', views.login),
                   ], None, None)),
                   
                   
    path('users', include(([
                               path('add/', views.login),
                               path('delete/', views.login),  # /user/delete/
                               path('edit/', views.login),
                               path('list/', views.login),
                           ], None))),
                           
    include("apps.api.urls")  # 一般是每个app中urls
    urlpatterns = [
    
    ]
    

3.4 name

给一个路由起个名字 + 根据名字反向生成URL。

urlpatterns = [
    path('login/', views.login),
]
# 很多功能,很多URL
urlpatterns = [
    path('login/', views.login, name="v1"),
    path('auth/', views.auth, name="v2"),
]

有了名字后,以后一般有两处会用到:

  • 在视图函数中生成URL

    from django.urls import reverse
    url = reverse("v2")   # /auth/
    url = reverse("v1")   # /login/
    
  • HTML模板,页面上有一个a标签,添加xx。

    <a href="/xxx/xxx/xx/">添加</a>
    
    <a href="{% url 'v1' %}">添加</a>
    <a href="{% url 'v2' %}">添加</a>
    
  • 扩展

    以后做权限管理,让name属性配合。
    
  • 主路由

    namespace写在主路由

    from django.urls import path, re_path, include
    
    # 很多功能,很多URL
    urlpatterns = [
        path('api/', include("apps.api.urls",namespace='x1')),
        path('web/', include("apps.web.urls",namespace='x2')),
    ]
    
  • api/urls.py

    from django.urls import path, re_path
    from . import views
    # 很多功能,很多URL
    urlpatterns = [
        path('login/', views.login,name="login"),
        path('auth/', views.auth, name='auth'),
    ]
    
  • web/urls.py

    from django.urls import path, re_path
    from . import views
    # 很多功能,很多URL
    urlpatterns = [
        path('home/', views.home,name='home'),
        path('order/', views.order,name='order'),
        path('auth/', views.order, name='auth'),
    ]
    

以后再某个URL或者视图中反向生成reverse:

from django.urls import reverse
url = reverse("x1:login")    # /api/login/ 使用reverse将namespace与name 反向生成路由地址
url = reverse("x1:order")    # /web/login/

url = reverse("x1:auth")    # /api/login/
url = reverse("x2:auth")    # /web/login/

两个扩展:

  • namespace需要设置app_name

    urlpatterns = [
        path('api/', include("apps.api.urls", namespace='x1')),
    ]
    
    from django.urls import path, re_path
    from apps.api import views
    
    # 很多功能,很多URL
    urlpatterns = [
        path('login/', views.login, name="login"),
        path('auth/', views.auth, name='auth'),
    ]
    
    app_name = "api"
    
  • 手动分发

添加文件夹

1.删除views新建App内views文件夹。

2.删除主目录下的templates,建App内templates文件夹。

3.新建static文件夹,内部添加plugins cs、js、image、自己的cs,同样也是建在app里面。

4.注册app

INSTALLED_APPS = [
    # 'django.contrib.admin',
    # 'django.contrib.auth',
    # 'django.contrib.contenttypes',
    # 'django.contrib.sessions',
    # 'django.contrib.messages',
    'django.contrib.staticfiles',
    'web.apps.WebConfig'
]

5.连接数据库

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'july_day06',  # 数据库名字
        'USER': 'root',
        'PASSWORD': 'root123',
        'HOST': '127.0.0.1',  # ip
        'PORT': 3306,
    }
}
#连接池
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, # 池中没有连接最多等待的时间。
        }
    }
}
安装 mysql 、mysqlclient与连接池
pip install pymysql
pip install mysqlclient 
pip install django-db-connection-pool
创建models后 运行以下两步完成创建表在mysql
python manage.py makemigrations
python manage.py migrate

mysql 基础命令

创建 数据库 CREATE DATABASE 名字;

show database show tables

redis 安装

  • 服务器 + redis安装启动

  • django

    • 安装连接redis包

      pip install django-redis
      
    • settings.py

      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": "密码",
              }
          }
      }
      
    • 手动操作redis

      from django_redis import get_redis_connection
      
      conn = get_redis_connection("default")
      conn.set("xx","123123")
      conn.get("xx")
      

mysql更改执行路径

image-20230716174935620

models如果是choices项的,在html中这样体现
{% for row in queryset %}
<td>{{ row.get_department_display }}</td>
{% end for %}
重点是 get_表名字_display
视图函数的另一种保存方式
 # 两种方式都可以储存
   1# Market = models.Market(department=dpt, name=name, password=pas, phone_number=phone)
    Market.save()
  2  # models.Market.objects.create(department=dpt, name=name, password=pas, phone_number=phone)
  
在项目中的 models.py 中添加以下类:

class Book(models.Model):
    id = models.AutoField(primary_key=True) # id 会自动创建,可以手动写入
    title = models.CharField(max_length=32) # 书籍名称
    price = models.DecimalField(max_digits=5, decimal_places=2) # 书籍价格
    publish = models.CharField(max_length=32) # 出版社名称
    pub_date = models.DateField() # 出版时间
中间件
#utls/md
from django.utils.deprecation import MiddlewareMixin
from django.conf import settings
from django.shortcuts import redirect

class UserInfo(object):
    def __init__(self, name,row, id):
        self.id = id
        self.name = name
        self.row=row
        self.menu_name = None
        self.text_list = []


class AuthMiddleware(MiddlewareMixin):
    def is_white_url(self, request):
        # 1.在白列表中的网站 直接跳过
        if request.path_info in settings.NB_WHITE_URL:
            return True

    def process_request(self, request):
        # 1.在白列表中的网站 直接跳过
        if self.is_white_url(request):
            return
        # 获取session中的信息,能获取到登录
        #  {'role': mapping[role], 'name': user_object.username, 'id': user_object.id}
        user_dict = request.session.get(settings.NB_SESSION_KEY)
        # 没有获取 就返回登录
        if not user_dict:
            return redirect(settings.NB_LOGIN_URL)
        print(user_dict, type(user_dict))
        # 已登录,封装用户信息
        request.nb_user = UserInfo(**user_dict)
        print(request.nb_user)
    def process_view(self, request, callback, callback_args, callback_kwargs):
        print("chuqu")

##############简要###################################
process_request,基于他实现用户是否已登录,继续;未登录则返回登录界面。
	- return None,继续向后访问
	- return 对象,直接返回。
	
process_view,权限校验
	- return None,继续向后访问
	- return 对象,直接返回。
	- 在他的request对象中有 resolver_match  ,包含当前请求的视图路由信息  .name->sms_login
		admin = ['sms_login',"xxx"]
	
process_response
#settings/
NB_MENU = {
    "PURCHASE": [
        {
            "tetx": "用户信息",
            "icon": "fa-bed",
            "children": [
                {'text': "订单列表", 'url': "/market_list/", 'name': "level_list"}
            ]
        },
    ],
    'MARKET': [
        {
            'text': "用户信息",
            'icon': "fa-bed",
            'children': [
                {'text': "级别管理", 'url': "/level/list/", 'name': "level_list"}
            ]
        },
    ],

}

#menu.py
from django.template import Library
import copy
from django.conf import settings

register = Library()


@register.inclusion_tag("tag/nb_menu.html")
def nb_menu(request):
    user_menu_list = copy.deepcopy(settings.NB_MENU[request.nb_user.row])
    for item in user_menu_list:

        for child in item['children']:
            if child['name'] == request.nb_user.menu_name:
                child['class'] = 'active'

    return {'menu_list': user_menu_list}


#templates/tag/nb_user
<div class="multi-menu">
    {% for item in menu_list %}
        <div class="item">
            <div class="title">
                <span class="icon-wrap"><i class="fa {{ item.icon }}"></i></span> {{ item.text }}
            </div>
            <div class="body {{ item.class }}">
                {% for child in item.children %}
                    <a class="{{ child.class }}" href="{{ child.url }}">{{ child.text }}</a>
                {% endfor %}
            </div>
        </div>
    {% endfor %}
</div>


#要导入的HTML文件
{% load menu %}
{% nb_menu request %}
中间件权限设置
    def process_view(self, request, callback, callback_args, callback_kwargs):
        if self.is_white_url(request):
            return
        current_name = request.resolver_match.url_name
        # 0.是否是公共权限
        if current_name in settings.NB_PERMISSION_PUBLIC:
            return
        # 1.根据用户角色获取自己具备所有的权限

        user_permission_dict = settings.NB_PERMISSION[request.nb_user.row]
        # 2.获取当前用户访问的URL
        current_name = request.resolver_match.url_name
        print(current_name)
        # 3.判断是否在自己具备的权限
        if current_name not in user_permission_dict:
            return HttpResponse("无权访问")
        # 4.有权限  就设置路径显示
        text_list = []
        text_list.append(user_permission_dict[current_name]["text"])
        # 5.有权限的路径导航
        menu_name = current_name
        while user_permission_dict[current_name]['parent']:
            menu_name = user_permission_dict[menu_name]['parent']
            text = user_permission_dict[menu_name]['text']
            text_list.append(text)

            text_list.append("首页")
            text_list.reverse()
            # 4.1 当前菜单的值
            request.nb_user.menu_name = menu_name

            # 4.2 路径导航
            request.nb_user.text_list = text_list

            print(text_list)
html 要写的路径代码
<ol class="breadcrumb">
    {% for text in request.nb_user.text_list %}
        <li><a>{{ text }}</a></li>
    {% endfor %}
</ol>

云服务器linx

pwd 查看目录

git 查看是否下载git

yum install git 下载git

git clone http://gitee.com/baixue888/order.git 上传

ls 查看是否order文件夹

cd order/ 进入目录

ls 查看文件内容

如果有修改git仓库代码 执行 git pull origin master

在git bash操作

ssh root@101.43.157.215

rm -rf order/ 在linx删除文件夹

git remote -v 查看git 远程源地址

git remote rm origin 删除所有远程地址

insert into mysql.user(user,host,password) values('baixuejie','%',password('baixuejie123!'));