zoukankan      html  css  js  c++  java
  • Python pip换源 创建虚拟环境 luffy项目配置(数据库bug)

    pip安装源

    基本使用

    1. 采用国内的源,加速下载模块速度 常用的pip源:

      -- 豆瓣:https://pypi.douban.com/simple
      -- 阿里:https://mirrors.aliyun.com/pypi/simple
      
    2. 换源安装命名

       pip install -i https://pypi.douban.com/simple 模块名字
      

    永久配置安装源

    Windows

    1、文件管理器文件路径地址栏敲:%APPDATA% 回车,快速进入 C:Users电脑用户AppDataRoaming 文件夹中

    2、新建 pip 文件夹并在文件夹中新建 pip.ini 配置文件

    3、新增 pip.ini 配置文件内容

    Linux

    1、在用户根目录下 ~ 下创建.pip隐藏文件夹,如果已经有了可以跳过

    -- mkdir ~/.pip
    

    2 . 进入.pip 隐藏文件夹并创建 pip.conf 配置文件

    -- cd ~/.pip && touch pip.conf
    

    3、启动 Finder(访达) 按 cmd+shift+g 来的进入,输入 ~/.pip 回车进入

    4、新增 pip.conf 配置文件内容

    文件配置内容

    [global]
    index-url = http://pypi.douban.com/simple
    [install]
    use-mirrors =true
    mirrors =http://pypi.douban.com/simple/
    trusted-host =pypi.douban.com
    

    虚拟环境安装

    1、使不同应用开发环境相互独立
    2、环境升级不影响其他应用,也不会影响全局的python环境
    3、防止出现包管理混乱及包版本冲突
    

    Windows

    安装:

    # 建议使用pip3安装到python3环境下
    pip3 install virtualenv
    pip3 install virtualenvwrapper-win
    

    Virtualenvwrapper管理虚拟环境 Virtualenvwrapper的使用(virtualenvwrapper-win依赖于virtualenv,所以也要安装virtualenv)

    配置虚拟环境管理器工作目录

    变量名:WORKON_HOME  变量值:自定义存放虚拟环境的绝对路径  # (重点)
    eg: WORKON_HOME: D:Virtualenvs
    

    同步配置信息:

    去向Python3的安装目录 => Scripts文件夹 => virtualenvwrapper.bat => 双击

    Linux

    安装

    pip3 install -i https://pypi.douban.com/simple virtualenv
    pip3 install -i https://pypi.douban.com/simple virtualenvwrapper
    

    工作文件

    # 先找到virtualenvwrapper的工作文件 virtualenvwrapper.sh,该文件可以刷新自定义配置,但需要找到它
    
    # MacOS可能存在的位置 /Library/Frameworks/Python.framework/Versions/版本号文件夹/bin
    
    # Linux可能所在的位置 /usr/local/bin  |  ~/.local/bin  |  /usr/bin
    
    # 建议不管virtualenvwrapper.sh在哪个目录,保证在 /usr/local/bin 目录下有一份
    
    # 如果不在 /usr/local/bin 目录,如在 ~/.local/bin 目录,则复制一份到 /usr/local/bin 目录
    
    -- sudo cp -rf ~/.local/bin/virtualenvwrapper.sh /usr/local/bin
    

    配置

    # 在 ~/.bash_profile 完成配置,virtualenvwrapper的默认默认存放虚拟环境路径是 ~/.virtualenvs
    
    # WORKON_HOME=自定义存放虚拟环境的绝对路径,需要自定义就解注
    
    VIRTUALENVWRAPPER_PYTHON=/usr/local/bin/python3
    
    source /usr/local/bin/virtualenvwrapper.sh
    
    # 在终端让配置生效:
    -- source ~/.bash_profile
    

    使用

    1、创建虚拟环境到配置的WORKON_HOME路径下

    # 选取默认Python环境创建虚拟环境:
    	-- mkvirtualenv 虚拟环境名称
    # 基于某Python环境创建虚拟环境:
    	-- mkvirtualenv -p python2.7 虚拟环境名称
    	-- mkvirtualenv -p python3.6 虚拟环境名称
    

    2、查看已有的虚拟环境

    -- workon
    

    3、使用某个虚拟环境

    -- workon 虚拟环境名称
    

    4、进入|退出 该虚拟环境的Python环境

    -- python | exit()
    

    5、为虚拟环境安装模块

    - pip或pip3 install 模块名
    

    6、退出当前虚拟环境

    -- deactivate
    

    7、删除虚拟环境(删除当前虚拟环境要先退出)

    -- rmvirtualenv 虚拟环境名称
    

    pycharm 中使用 就直接把虚拟环境的script里的python添加到环境里就行了

    luffy目录重构

    ├── luffyapi
        ├── logs/                  # 项目运行时/开发时日志目录 - 文件夹
        ├── manage.py              # 脚本文件
        ├── luffyapi/              # 项目主应用,开发时的代码保存 - 包
            ├── apps/              # 开发者的代码保存目录,以模块[子应用]为目录保存 - 包
            ├── libs/              # 第三方类库的保存目录[第三方组件、模块] - 包
            ├── settings/          # 配置目录 - 包
                ├── dev.py         # 项目开发时的本地配置
                └── prod.py        # 项目上线时的运行配置
            ├── urls.py            # 总路由
            └── utils/             # 多个模块[子应用]的公共函数类库[自己开发的组件]
        └── scripts/               # 保存项目运营时的脚本文件 - 文件夹
    

    dev 和 prod 文件 一个是 项目开发时的 配置 一个是上线之后的配置 我们需要将 settings里的所有内容复制粘贴到 dev中

    然后 在编辑中 编辑 他默认的 DJANGO_SETTINGS_MODULE 改为 自己配置的 dev

    上线之后依赖的是 wsgi.py启动的

    日志文件配置

    LOGGING = {
        'version': 1,
        'disable_existing_loggers': False,
        'formatters': {
            'verbose': {
                'format': '%(levelname)s %(asctime)s %(module)s %(lineno)d %(message)s'
            },
            'simple': {
                'format': '%(levelname)s %(module)s %(lineno)d %(message)s'
            },
        },
        'filters': {
            'require_debug_true': {
                '()': 'django.utils.log.RequireDebugTrue',
            },
        },
        'handlers': {
            'console': {
                'level': 'DEBUG',
                'filters': ['require_debug_true'],
                'class': 'logging.StreamHandler',
                'formatter': 'simple'
            },
            'file': {
                # 实际开发建议使用WARNING
                'level': 'INFO',
                'class': 'logging.handlers.RotatingFileHandler',
                # 日志位置,日志文件名,日志保存目录必须手动创建,注:这里的文件路径要注意BASE_DIR代表的是小luffyapi
                'filename': os.path.join(os.path.dirname(BASE_DIR), "logs", "luffy.log"),
                # 日志文件的最大值,这里我们设置300M
                'maxBytes': 300 * 1024 * 1024,
                # 日志文件的数量,设置最大日志数量为10
                'backupCount': 10,
                # 日志格式:详细格式
                'formatter': 'verbose',
                # 文件内容编码
                'encoding': 'utf-8'
            },
        },
        # 日志对象
        'loggers': {
            'django': {
                'handlers': ['console', 'file'],
                'propagate': True, # 是否让日志信息继续冒泡给其他的日志处理系统
            },
        }
    }
    
    import logging
    logger = logging.getLogger('django')
    # 之后哪里需要就直接导入 logger 就行了
    
    from utils.loggings import logger
    logger.error('xxx')
    

    封装项目异常处理

    utils/exception.py

    from rest_framework.views import exception_handler as drf_exception_handler
    from rest_framework.views import Response
    from rest_framework import status
    from utils.logging import logger
    def exception_handler(exc, context):
        response = drf_exception_handler(exc, context)
        # 异常模块就是记录项目的错误日志
        logger.error('%s - %s - %s' % (context['view'], context['request'].method, exc))
        if response is None:
            return Response({
                'detail': '%s' % exc
            }, status=status.HTTP_500_INTERNAL_SERVER_ERROR, exception=True)
        return response
    

    settings.py

    REST_FRAMEWORK = {
        'EXCEPTION_HANDLER': 'utils.exception.exception_handler',
    }
    

    二次封装Response模块

    utils/response.py

    class APIResponse(Response):
        def __init__(self, data_status=0, data_msg='ok', results=None, http_status=None, headers=None, exception=False, **kwargs):
            data = {
                'status': data_status,
                'msg': data_msg,
            }
            if results is not None:
                data['results'] = results
            data.update(kwargs)
    
            super().__init__(data=data, status=http_status, headers=headers, exception=exception)
    

    路由组件配置

    utils/router.py

    from rest_framework.routers import Route, DynamicRoute, SimpleRouter as DRFSimpleRouter
    
    class SimpleRouter(DRFSimpleRouter):
        routes = [
            # List route.  /资源s/
            Route(
                url=r'^{prefix}{trailing_slash}$',
                mapping={
                    'get': 'list',  # 群查
                    'post': 'create',  # 单增、群增
                    'put': 'multiple_update',  # 群整改
                    'patch': 'multiple_partial_update',  # 群局改
                    'delete': 'multiple_destroy',  # 群删
                },
                name='{basename}-list',
                detail=False,
                initkwargs={'suffix': 'List'}
            ),
            # Dynamically generated list routes. Generated using
            # @action(detail=False) decorator on methods of the viewset.
            DynamicRoute(
                url=r'^{prefix}/{url_path}{trailing_slash}$',
                name='{basename}-{url_name}',
                detail=False,
                initkwargs={}
            ),
            # Detail route.  /资源s/(pk)/
            Route(
                url=r'^{prefix}/{lookup}{trailing_slash}$',
                mapping={
                    'get': 'retrieve',  # 单查
                    'put': 'update',  # 单整改
                    'patch': 'partial_update',  # 单局改
                    'delete': 'destroy'  # 单删
                },
                name='{basename}-detail',
                detail=True,
                initkwargs={'suffix': 'Instance'}
            ),
            # Dynamically generated detail routes. Generated using
            # @action(detail=True) decorator on methods of the viewset.
            DynamicRoute(
                url=r'^{prefix}/{lookup}/{url_path}{trailing_slash}$',
                name='{basename}-{url_name}',
                detail=True,
                initkwargs={}
            ),
        ]
    
    # 对外提供十大接口的router对象
    router = SimpleRouter()
    # eg: router.register('users', UserModelViewSet, basename='user')
    """
    /users/
    'get': 'list',  # 群查
    'post': 'create',  # 单增、群增
    'put': 'multiple_update',  # 群整改
    'patch': 'multiple_partial_update',  # 群局改
    'delete': 'multiple_destroy',  # 群删
    
    /users/(pk)/
    'get': 'retrieve',  # 单查
    'put': 'update',  # 单整改
    'patch': 'partial_update',  # 单局改
    'delete': 'destroy'  # 单删
    """
    
    # from rest_framework.routers import SimpleRouter
    from .router import SimpleRouter
    router = SimpleRouter()
    router.register('v7/cars', views.CarModelViewSet, basename='car')
    # router.register('books', views.BookModelViewSet, basename='book')
    # router.register('users', views.UserModelViewSet, basename='user')
    
    urlpatterns = [
        url(r'', include(router.urls))
    ]
    # urlpatterns.extend(router.urls)
    print(router.urls)
    
    

    数据库配置

    1.管理员连接数据库
    >: mysql -uroot -proot
    
    2.创建数据库
    >: create database luffy default charset=utf8;
    
    3.查看用户
    >: select user,host,password from mysql.user;
    

    为指定数据库配置指定账户

    设置权限账号密码
    # 授权账号命令:grant 权限(create, update) on 库.表 to '账号'@'host' identified by '密码'
    
    1.配置任意ip都可以连入数据库的账户
    >: grant all privileges on luffy.* to 'luffy'@'%' identified by 'Luffy123?';
    
    2.由于数据库版本的问题,可能本地还连接不上,就给本地用户单独配置
    >: grant all privileges on luffy.* to 'luffy'@'localhost' identified by 'Luffy123?';
    
    3.刷新一下权限
    >: flush privileges;
    
    只能操作luffy数据库的账户
    账号:luffy
    密码:Luffy123?
    

    配置文件配置

    DATABASES = {
        'default': {
            'ENGINE': 'django.db.backends.mysql',
            'NAME': 'luffy',
            'USER': 'luffy',
            'PASSWORD': 'Luffy123?',
            'HOST': 'localhost',
            'PORT': 3306
        }
    }
    import pymysql
    pymysql.install_as_MySQLdb()
    

    Django 2.x 一些版本pymysql兼容问题

    Django不采用2.0.7版本很可能出现以下问题,需要修改源代码

  • 相关阅读:
    1451. Rearrange Words in a Sentence
    1450. Number of Students Doing Homework at a Given Time
    1452. People Whose List of Favorite Companies Is Not a Subset of Another List
    1447. Simplified Fractions
    1446. Consecutive Characters
    1448. Count Good Nodes in Binary Tree
    709. To Lower Case
    211. Add and Search Word
    918. Maximum Sum Circular Subarray
    lua 时间戳和时间互转
  • 原文地址:https://www.cnblogs.com/lddragon1/p/12173356.html
Copyright © 2011-2022 走看看