zoukankan      html  css  js  c++  java
  • django项目准备

    pip换源

    1 pip3 install pymysql
    2 pip3 install pymysql -i  地址
    3 配置pip下载地址为豆瓣源
    	-来到C:UsersoldboyAppDataRoaming
        -创建一个pip文件夹
        -新建一个文件pip.ini
        -写入
            [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环境中安装
    
    	-下载
    	pip3 install virtualenv
        pip3 install virtualenvwrapper-win
        
    	-修改环境变量 添加进去
        	WORKON_HOME: D:Virtualenvs
        -python安装路径,scripts文件下执行virtualenvwrapper.bat
        
    3 使用:
    
    	-workon  #列出有的虚拟环境
        -workon aaa  #使用这个虚拟环境 
        -mkvirtualenv -p python3 luffy # 创建虚拟环境
        -rmvirtualenv 虚拟环境名字 # 删除虚拟环境
        
    4 安装django环境
    	pip install django==2.2.2
        
    5 基于虚拟环境创建项目,不要再pycharm中选择虚拟环境了,选择已经创建好的虚拟环境
    

    目录结构调整

    
        ├── luffyapi
            ├── logs/				# 项目运行时/开发时日志目录 - 包
            ├── manage.py           # 脚本文件
            
            ├── luffyapi/      		# 项目主应用,开发时的代码保存 - 包
                ├── apps/      		# 开发者的代码保存目录,以模块[子应用]为目录保存 - 包
                ├── libs/      		# 第三方类库的保存目录[第三方组件、模块] - 包
                ├── settings/  		# 配置目录 - 包
                    ├── dev.py   	# 项目开发时的本地配置
                    └── prod.py  	# 项目上线时的运行配置
                ├── urls.py    		# 总路由
                └── utils/     		# 多个模块[子应用]的公共函数类库[自己开发的组件]
         	└── scripts/       		# 保存项目运营时的脚本文件 - 文件夹
            
       -创建app,需要到apps目录下创建 python ../../manage.py startapp user
    
       -luffyapi--》下的luffyapi也加入到了环境变量,以后导入模块,从luffyapi--》下的luffyapi开始导入即可,pycharm会飘红,右键变成source
       -在setting中注册前,要把apps的路径加入到环境变量
    # manage.py
      os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'luffyapi.settings.dev')
    # 项目上线,走的不是manage.py---》uwsgi.py,需要修改
    
    	python ../../manage.py startapp home
    

    requirement.txt 模块安装

    每个python项目,都应该有个requirement.txt--->项目依赖的模块
    	>pip freeze >requirement.txt  #生成
        >pip install -r requirement.txt -i 豆瓣源   # 下载
        
        >使用whl文件装,windows上装的模块,都是 xxx.whl文件
        	-直接去网站搜:https://www.lfd.uci.edu/~gohlke/pythonlibs/#twisted
            -指定版本和平下载Twisted‑20.3.0‑cp36‑cp36m‑win_amd64.whl
            -cmd下:pip3 install 文件的路径
            
        # 离线安装
        >pip download -r requirement.txt -d "D:pipDownloadTest"
        >切换终端在待安装文件目录下(D:pipDownloadTest)
    		pip install PyMySQL-0.9.3-py2.py3-none-any.whl
    

    数据库配置

    # 创建数据库用户,并且授予luffyapi这个库的权限
    	-grant all privileges on luffyapi.* to 'luffyapi'@'%' identified by 'Luffy123?';
        -grant all privileges on luffyapi.* to 'luffyapi'@'localhost' identified by 'Luffy123?';
        -flush privileges;
    

    User表配置

    # 用户要基于auth的user表,必须在数据库迁移命令之前操作好,后期如果再做,会出错
    	-把所有app下的迁移文件,全删除
        -admin,auth app下的迁移文件删除
        -删库(数据一定要导出来),重新迁移
        
    # 继承AbstractUser,增加两个字段,telephone,icon(依附于pillow)
    
    # 在setting中配置
        MEDIA_URL='/media/'
        MEDIA_ROOT=os.path.join(BASE_DIR,'media')  #现在的BASEDIR是luffyapi下的luffyapi
        AUTH_USER_MODEL='user.user'
        
    # 路由,打开media文件夹
    re_path('media/(?P<path>.*)', serve,{'document_root':settings.MEDIA_ROOT}),
    

    后台response和异常和日志封装

    # utils/response
    
    from rest_framework.response import  Response
    
    
    class APIResponse(Response):
        def __init__(self,code=1,msg='成功',result=None,status=None,headers=None,content_type=None,**kwargs):
            dic={
                'code':code,
                'msg':msg
                 }
            if result:
                dic['result']=result
            dic.update(kwargs)
    
            #对象来调用对象的绑定方法,会自动传值
           super().__init__(data=dic,status=status,headers=headers,content_type=content_type)
    
            # 类来调用对象的绑定方法,这个方法就是一个普通函数,有几个参数就要传几个参数
    Response.__init__(data=dic,status=status,headers=headers,content_type=content_type)
    
    #utils/exceptions.py
    
    from rest_framework.views import exception_handler
    # from luffyapi.utils import response
    from .response import APIResponse
    from .logger import log
    def common_exception_handler(exc, context):
        log.error('view是:%s ,错误是%s'%(context['view'].__class__.__name__,str(exc)))
        ret=exception_handler(exc, context)
        if not ret:
            if isinstance(exc,KeyError):
                return APIResponse(code=0, msg='key error')
            return APIResponse(code=0,msg='error',result=str(exc))
        else:
            return APIResponse(code=0,msg='error',result=ret.data)
    
    # 封装logger
    # setting.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': {
                # 实际开发建议使用WARNING
                'level': 'DEBUG',
                'filters': ['require_debug_true'],
                'class': 'logging.StreamHandler',
                'formatter': 'simple'
            },
            'file': {
                # 实际开发建议使用ERROR
                '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': 100,
                # 日志格式:详细格式
                'formatter': 'verbose',
                # 文件内容编码
                'encoding': 'utf-8'
            },
        },
        # 日志对象
        'loggers': {
            'django': {
                'handlers': ['console', 'file'],
                'propagate': True, # 是否让日志信息继续冒泡给其他的日志处理系统
            },
        }
    }
    #utils/logger
    
    import logging
    # log=logging.getLogger('名字') # 跟配置文件中loggers日志对象下的名字对应
    log=logging.getLogger('django')
    
    
    # 以后使用,导入直接用
    from luffyapi.utils.logger import log
    log.info('xxxxxx')  # 不要写print
    

    跨域问题及解决

    # xss:跨站脚本攻击,cors:跨域资源共享,csrf:跨站请求伪造
    
    # 1 同源策略:请求的url地址,必须与浏览器上的url地址处于同域上,也就是域名,端口,协议相同.
    # 2 CORS:跨域资源共享,允许不同的域来我的服务器拿数据
    # 3 CORS请求分成两类:简单请求(simple request)和非简单请求(not-so-simple request)
    
    简单请求:
    (1)请求方法是以下三种方法之一:
            HEAD
            GET
            POST
    (2)HTTP的头信息不超出以下几种字段:
            Accept
            Accept-Language
            Content-Language
            Last-Event-ID
            Content-Type:只限于三个值application/x-www-form-urlencoded、multipart/form-data、text/plain
            
    如果发送post请求,数据格式是json---》非简单请求,非简单请求发两次,一次OPTIONS请求,一次真正的请求
    

    解决跨域访问

    方式一:
    
    后端处理,开启cors,跨域资源共享,中间件写
    
    class MyMiddle(MiddlewareMixin):
        def process_response(self, request, response):
            response['Access-Control-Allow-Origin'] = '*'
            if request.method == "OPTIONS":
                response["Access-Control-Allow-Headers"] = "Content-Type"
                response["Access-Control-Allow-Headers"] = "authorization"
            return response
        
    配置中间件
    
    方式二:
    
    使用第三方,django-cors-headers
    
    -pip install django-cors-headers
    
    -注册app:'corsheaders',
    -配置中间件:corsheaders.middleware.CorsMiddleware
    
    -setting中配置:
    CORS_ORIGIN_ALLOW_ALL = True
    CORS_ALLOW_METHODS = (
    	'DELETE',
    	'GET',
    	'OPTIONS',
    	'PATCH',
    	'POST',
    	'PUT',
    	'VIEW',
    )
    CORS_ALLOW_HEADERS = (
    	'authorization',
    	'content-type',
    )
    

    axios请求

    cnpm install axios
    
    main.js
    
    import axios from 'axios'
    Vue.prototype.$axios = axios;
    	
    报错:301:没数据,axios的路径缺一个 / 
    
    
    this.$axios.get('http://127.0.0.1:8000/home/home/').
          then(function (response) {
            console.log(response)
          }).catch(function (error) {
            console.log(error)
          })
            
    es6的箭头函数
    
    function (response) { console.log(response)}
    response=>{ console.log(response)}
    

    xadmin后台管理

    1 安装 
    pip install https://codeload.github.com/sshwsfc/xadmin/zip/django2
        
    2 在app中注册
    	# xadmin主体模块
        'xadmin',
        # 渲染表格模块
        'crispy_forms',
        # 为模型通过版本控制,可以回滚数据
        'reversion',
        
    3 数据迁移
    python manage.py makemigrations
    python manage.py migrate
    
    4 主路由替换掉admin:主urls.py
        # xadmin的依赖
        import xadmin
        xadmin.autodiscover()
        # xversion模块自动注册需要版本控制的 Model
        from xadmin.plugins import xversion
        xversion.register_models()
    
        urlpatterns = [
            path(r'xadmin/', xadmin.site.urls),
        ]
    
  • 相关阅读:
    POJ 3616 Milking Time(简单区间DP)
    AizuOJ ALDS1_7_A Rooted Trees(有根树的表达)
    jQuery中 attr() 和 prop() 的区别
    前后端交互模式
    快速排序
    冒泡排序实现
    Vue 组件间进行通信
    JavaScript 数组常用方法
    如何将内网映射到公网?
    javax.mail.AuthenticationFailedException: 535 Login Fail. Please enter your authorization code to login. More information in
  • 原文地址:https://www.cnblogs.com/pythonwl/p/13399592.html
Copyright © 2011-2022 走看看