Mac上搭建虚拟环境以及Django项目开启和配置

帅比萌擦擦* 提交于 2020-02-04 08:56:00

1.首先给配置全局pip换源:

'''
0.换源理由:
采用国内源,加载模块的下载速度。配置了全局换源后,就不用担心每次下载都需要换源了,一次性更换更彻底。
当然你说你不用换,那你也不用看。直接用国外的源也是可以的。只是国外的下载速度相对来说慢一些。
但是你又不想下国外的源,又想不换全局的。那你每次下载模块你就这样来(以下是两种都行):
 pip3 install -i https://pypi.douban.com/simple 模块名
 pip3 install -i https://mirrors.aliyun.com/pypi/simple 模块名
 
换源彻底的从这里开始:

1.在用户的根目录下创建一个 .pip 隐藏文件夹
终端执行:mkdir ~/.pip

2.在隐藏文件夹里创建 pip.conf 配置文件
终端执行:
    切换到 .pip 文件夹下:
                            执行:cd .pip
                                            再执行:touch pip.conf
                                            
3.在 .pip 文件夹下打开 pip.conf 配置文件
终端执行:
    切换到 .pip 文件下,执行 open pip.conf

4.执行 open pip.conf 后,在配置文件里添加换源内容:
有以下两种源,随你选择:
-- 豆瓣:https://pypi.douban.com/simple:
以下才是内容:

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


-- 阿里:https://mirrors.aliyun.com/pypi/simple
以下才是内容:
[global]
index-url = https://mirrors.aliyun.com/pypi/simple
[install]
use-mirrors = true
mirrors = http:https://mirrors.aliyun.com/pypi/simple/
trusted-host = mirrors.aliyun.com


当你再去执行下载模块的时候,已经变得很快了。
'''

2.搭建虚拟环境(基于python3)

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

让我们开始搭建吧:
1.在终端执行(如果没换源的请走第一个模块的内容)也就是安装虚拟环境:
-- pip3 install virtualenv
-- pip3 install virtualenvwrapper

2.配置(以下都是在终端执行的):
-- open ~/.zshrc
配置环境变量(不需要改变以有的环境,在原基础上添加即可):
-- export WORKON_HOME='/Users/cody/管理虚拟环境名'
-- export VIRTUALENVWRAPPER_PYTHON='/Library/Frameworks/Python.framework/Versions/3.6/bin/python3'
-- source /Library/Frameworks/Python.framework/Versions/3.6/bin/virtualenvwrapper.sh
保存内容后执行:
-- source ~/.zshrc

3.创建环境
你可以在根目录下创建一个管理所有虚拟环境的文件夹:
终端执行:
-- mkidr 文件夹名
-- cd 文件夹名
-- virtualenv 虚拟环境名 注:(这样创建的虚拟环境是系统默认的python2)
-- mkvirtualenv -p python3 虚拟环境名  注:指定python3创建虚拟环境
-- virtualenv -p python3 虚拟环境名    注:这样也行

4.进入环境,并使用

查看所有虚拟环境          -- workon
进入虚拟环境           -- workon 虚拟环境名
下载模块(8.x)       -- pip3 install django
退出环境           -- deactivate
删除环境          -- rmvirtualenv 虚拟环境名

'''

3.Django项目的创建以及配置

环境创建
'''
都是在终端上执行
1.创建项目的虚拟环境

-- virtualenv -p python3 dgtest

2.在虚拟环境下安装所需依赖

-- pip3 install django
-- pip3 install djangorestframework
-- pip3 install pymysql

'''
项目创建
'''
终端上执行

1.为项目创建新的文件夹

-- mkidr test

2.创建Django项目

-- cd test
-- django-admin startproject testapi

3.用pycharm打开项目,并选择创建好的虚拟环境
'''
重构项目目录
'''
├─testapi                     #根目录
    ├── logs                            #项目运行时/开发时日志目录 - 文件夹
    ├── testapi                   #项目主应用,开发时的代码保存 - 包
    |   ├── apps                        # 开发者的代码保存目录,以模块[子应用]为目录保存 - 包
    |   ├── libs                        # 第三方类库的保存目录[第三方组件、模块] - 包
    |   ├── settins               # 配置目录 - 包
  | |    ├── dev.py           # 项目开发时的本地配置
  | |    ├── prod.py          # 项目上线时的运行配置
    |   ├── utils                     # 多个模块[子应用]的公共函数类库[自己开发的组件] -包
    |   ├── __init__.py
    |   ├── urls.py                 # 总路由
    |   ├── wsgi.py
    ├── scripts                   # 保存项目运营时的脚本文件 - 文件夹
    ├── manage.py                   # 脚本文件
'''
配置开发环境
'''
1.将原有的 statings 文件夹里的内容剪切到新的 dev.py 文件里

2.修改 wsgi.py 与 manage.py 两个文件中的下面的内容

os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'testapi.settings')
修改为:
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'testapi.settings.dev')

3.将Django的环境语言配置成中文版(随便你选择,若不配也行),在 dev.py 里:
LANGUAGE_CODE = 'zh-hans'
TIME_ZONE = 'Asia/Shanghai'
USE_TZ = False

4.修改Django的启动配置:

DJANGO_SETIONS_MODUD=testapi.settings
修改为:
DJANGO_SETIONS_MODUD=testapi.settings.dev

5.在任意__init__.py 文件下测试配置是否为 dev.py
from django.conf import settings
print(settings)
'''
配置日志(dev.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", "test.log"),
            # 日志文件的最大值,这里我们设置300M
            'maxBytes': 300 * 1024 * 1024,
            # 日志文件的数量,设置最大日志数量为10
            'backupCount': 10,
            # 日志格式:详细格式
            'formatter': 'verbose',
            # 文件内容编码
            'encoding': 'utf-8'
        },
    },
    # 日志对象
    'loggers': {
        'django': {
            'handlers': ['console', 'file'],
            'propagate': True, # 是否让日志信息继续冒泡给其他的日志处理系统
        },
    }
}
封装logger(utils/logging.py)
import logging
logger = logging.getLogger('django')
环境变量配置
import sys
sys.path.insert(0, BASE_DIR)
APPS_DIR = os.path.join(BASE_DIR, 'apps')
sys.path.insert(1, APPS_DIR)
封装项目异常处理(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)
    if response is None:
        logger.error('%s - %s - %s' % (context['view'], context['request'].method, exc))
        return Response({
            'detail': '服务器错误'
        }, status=status.HTTP_500_INTERNAL_SERVER_ERROR, exception=True)
    return response
二次封装response模块(utils/response.py)
from rest_framework.response import Response

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)
在testapi/apps/下创建user模块
'''
在pycharm里的终端输入:
-- cd testapi/apps
-- python ../../manage.py startapp user 
'''

4.数据库配置(基于mysql 8.x版本)

'''
一.在终端进入mysql后
第一步:

create user '用户名'@'%' identified by '用户密码'
create user 'test'@'localhost' identified by '123456'

第二步:

grant all privileges on 数据库名.* to '用户名'@'%' with grant option
grant all privileges on test.* to 'test'@'localhost' with grant option

第三步:
刷新
flush privileges

第四步检验是否成功:

退出当前帐号,用新帐号登陆,再查看所有库即可。此时用户指定库搞定

二.配置Django连接mysql (dev.py)
1.DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql', #指定Django连接mysql
        'NAME': 'test', #库名
        'USER':'test',  #用户名
        'PASSWORD':'123456', #密码
        'HOST': '127.0.0.1',  #本地地址
        'PORT': 3306,       #端口号

    }
}

2.testpai/__init__.py
import pymysql
pymysql.install_as_MySQLdb()

i.此时由于版本问题 可能会报这个错误:“RuntimeError: cryptography is required for sha256_password or caching_sha2_password”

那么,请不要慌张,请下载以下插件:
pip install cryptography

ii.如果还有这个错误:“mysqlclient 1.3.13 or newer is requitrd:you have 0.9.3”
进去line 36 那个源码,将 
if version < (1,3,13)  等源码注释

iii.如果是这个错误:"'str' object has on attribute 'decode'"
进去line 146 加上
query = query.encode()

以上是这个版本可能报的错误,

三.mysql数据库一些常规指令
删除用户
delete from mysql.user where user='luffy' and host='%'

查看用户
select user,host from mysql.user

查看密码加密规则
select plugin,authentication_string from mysql.user

修改加密规则(我测试了,修改不了加密规则,还是老老实实下载那个插件靠谱,别在这浪费时间了)
alter user '用户名'@'localhost' identified by 'password' password expire never

更新用户密码
alter user '用户名'@'localhost' identified with mysql_native_password by 'password'

重制密码
alter user '用户名'@'localhost' identified by '用户密码'




'''

5.创建user表对应的model(user/models.py)

from django.db import models
from django.contrib.auth.models import AbstractUser
class User(AbstractUser):
    phone = models.CharField(max_length=11, unique=True)
    icon = models.ImageField(upload_to='icon', default='icon/default.png')

    class Meta:
        db_table = 'test_user'
        verbose_name = '用户表'
        verbose_name_plural = verbose_name

    def __str__(self):
        return self.username
配置user表(dev.py)
INSTALLED_APPS = [
    # ...
    'user',
]

# 自定义User表
AUTH_USER_MODEL = 'user.User'
配置media(dev.py)
'在testapi 下创建文件夹 media,给用户暴露出去的接口'

MEDIA_URL = '/media/'
MEDIA_ROOT = os.path.join(BASE_DIR, 'media')

'media 目录配置'
'''
├── testapi
    └── testapi
        └── media/  
                        └── icon 
                                └── default.png
'''
主路由配置:testate/urls.py
from django.contrib import admin
from django.urls import path,re_path,include
from django.views.static import serve
from django.conf import settings

urlpatterns = [
    path('admin/', admin.site.urls),
    path('user/', include('user.urls')),
    re_path('^media/(?P<path>.*)',serve,{'document_root':settings.MEDIA_ROOT})
]
子路由配置:user/urls.py
from django.urls import path, re_path
urlpatterns = [
]
数据库迁移命令(在根目录下)
python3 manage.py makemigrations
python3 manage.py migrate

'将user表注册在admin里'

from django.contrib import admin
from user import models
admin.site.register(models.User)

'创建超级用户'
python3 manage.py createsuperuser
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!