• SAE部署Django1.6+MySQL


    【解决】SAE部署Django1.6+MySQL

    终于可以舒口气了,今天大部分时间都在搞这个,很是蛋疼,网上资料良莠不齐,我不信这个之前没人做过,但是他们确实分享的不够好。

    废话不多说,还是记录一下今天的工作吧。

    1,装SVN

    这个没什么好说的,去官网下下来,一路next装上而已,不过用SVN上传文件到SAE还是挺慢的,上传过程中我睡了一觉。

    2,检出版本到本地

    之前在SAE上尝试过部署,结果失败了,所以这次新开了版本,也就是版本2,用SVN检出到本地。

    3,主要操作

    从这里开始是重点!

    刚检出版本2到本地的时候,2目录下只有config.yaml和index.wsgi两个文件,将本项目myenrich拷过来,注意目录结构,如图:

    本地是这样的

    首先忽略下图的db.sqlite3和sqlite3.exe,这俩是轻量级数据库,在SAE上用不着,那么上图的目录结构比下图多了两个文件夹:site-packages和static,为什么,下面来讲:

    • site-packages

    目前SAE支持Django的默认版本是1.2.7,1.4也支持,但我的项目是基于1.6.5的,所以这里会麻烦一点,要自己把Django1.6.5的包上传。

    自己建一个site-packages文件夹,位置如上图,然后去python安装位置(例如C:Python27Libsite-packages)把Django包拷贝过来。

    然后修改config.yaml和index.wsgi,如下(基本上是俩文件的完整代码,之所以说基本上算,是因为我的文件里还有其他代码,但是我认为它没影响,不是注释就是不起作用的代码):

    复制代码
    #-- config.yaml -- #
    
    name: myenrich
    version: 2
    
    libraries:
    -name: django
    version: "1.6"
    复制代码
    复制代码
    #-- index.wsgi --#
    
    import os
    import sys
    
    root = os.path.dirname(__file__)
    sys.path.insert(0, os.path.join(root, '.', 'site-packages'))
    
    import django.core.handlers.wsgi
    import sae
    
    os.environ['DJANGO_SETTINGS_MODULE'] = 'myenrich.settings'
    application = sae.create_wsgi_app(django.core.handlers.wsgi.WSGIHandler())
    复制代码

    注意:

    首先,这里的代码要自己根据自己的情况来改,我这就和网上略不同,因为目录结构的关系,我的site-packages和index.wsgi等都 在一个目录层次,那么我的sys.path.insert就这么写,如果不是这样的层次,那就需要改sys.path.insert()函数中 os.path.join(roo, '*', 'site-packages')的"*"部分!这个灵活变动很重要,不然找不到路径的话啥都白搭。

    另外,root和sys.path.insert做完之后才能import django,不然连django都找不到,import谁去。

    最后,os.environ['DJANGO_SETTINGS_MODULE'] = ‘myenrich.settings’,这里的myenrich是自己的项目名,或许也跟目录结构有关,这点可以从图中看出。

    其实我把2/myenrich/wsgi.py也改了,但不知道它起作用了没,贴代码吧

    复制代码
    import os
    import sys
    
    root = os.path.dirname(__file__)
    
    sys.path.insert(0, os.path.join(root, '..', 'site-packages'))
    # We defer to a DJANGO_SETTINGS_MODULE already in the environment. This breaks
    # if running multiple sites in the same mod_wsgi process. To fix this, use
    # mod_wsgi daemon mode with each site in its own daemon process, or use
    # os.environ["DJANGO_SETTINGS_MODULE"] = "mysite.settings"
    os.environ.setdefault("DJANGO_SETTINGS_MODULE", "myenrich.settings")
    
    # This application object is used by any WSGI server configured to use this
    # file. This includes Django's development server, if the WSGI_APPLICATION
    # setting points here.
    from django.core.wsgi import get_wsgi_application
    application = get_wsgi_application()
    
    # Apply WSGI middleware here.
    # from helloworld.wsgi import HelloWorldApplication
    # application = HelloWorldApplication(application)
    复制代码

    做到这一步的话,应该是可以跑起来了,但是其他问题来了,虽然能跑起来,css和js却失效了,通过审查元素发现链接错了。

    哦,对了,下午配置的时候出现找不到django.middleware.clickjacking的问题,我不明白这是干什么用的,所以我直接在2/myenrich/settings.py里把它注释掉了。

    复制代码
    MIDDLEWARE_CLASSES = (
        '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',
    )
    复制代码
    • static

    之前在本地的时候没问题,SAE上找css和js的方法和本地不同么,反正按它的意思来改,所以我把static文件夹给提了出来,放在根目录下。

    4,配置数据库

    最后一步配置数据库,本地原来就是使用Django和MySQL的话这步问题其实不大。

    用WAMP的phpMyAdmin进去把项目数据库导出成sql格式,有个插曲,WAMP一开始绿不了,原来是因为之前做项目的时候IIS开了,占用了80端口,把IIS关了就好了。

    配置数据库只要是要改2/myenrich/settings.py文件!

    A.把以下代码加到头部

    复制代码
    import os.path 
    import sae.const
    from os import environ
    #debug = not environ.get("APP_NAME", "") 
    #if debug:
    #    MYSQL_DB = 'myenrich' 
    #   MYSQL_USER = 'root' 
    #    MYSQL_PASS = '' 
    #    MYSQL_HOST_M = '127.0.0.1' 
    #    MYSQL_HOST_S = '127.0.0.1' 
    #    MYSQL_PORT = '3306' 
    #else: 
    #SAE 
    import sae.const 
    MYSQL_DB = sae.const.MYSQL_DB 
    MYSQL_USER = sae.const.MYSQL_USER 
    MYSQL_PASS = sae.const.MYSQL_PASS 
    MYSQL_HOST_M = sae.const.MYSQL_HOST 
    MYSQL_HOST_S = sae.const.MYSQL_HOST_S 
    MYSQL_PORT = sae.const.MYSQL_PORT
    复制代码

    这里我直接就不让它调试了就```

    B.修改DATABASES字段

    复制代码
    DATABASES = {
        'default': {
            # 'ENGINE': 'django.db.backends.sqlite3',
            # 'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
    # 'ENGINE': 'django.db.backends.mysql', # 'NAME': 'myenrich', # 'USER': 'root', # 'PASSWORD': '', # 'HOST': '', # 'PORT': '3306',
    'ENGINE': 'django.db.backends.mysql', 'NAME': MYSQL_DB, 'USER': MYSQL_USER, 'PASSWORD': MYSQL_PASS, 'HOST': MYSQL_HOST_M, 'PORT': MYSQL_PORT, } }
    复制代码

    前两行是之前用sqlite3的代码,中间的注释部分是本地用MySQL的方法,SAE用底下没注释的。

    这里的NAME啊USER啊很明显用的是步骤A定义的变量,网上的教程居然有类似'NAME': 'MYSQL_DB'的写法,刚开始没注意吃亏了。

    到这里代码就改完了,到SAE对应项目下的“服务管理”—“MySQL”—“管理MySQL”,把之前导出的sql文件导入进来就可以了。

    -- 更新 2015-08-01

    这里要注意,我用Django版本是1.8,其中默认建立的数据库中用到datetime是以datetime(6)这样的形式表示,而SAE上不支持datetime后跟括号,可能版本比较老。

    因为我在本地phpMyAdmin导出sql脚本后要把datetime(6)改成datetime,这样才能顺利导入到SAE的mysql中。

    用SVN同步修改,然后访问对应网址,应该就没有问题了。

    配置过程很艰难,记录博客的时候不见得记得清每一步和犯下的所有错误,博客也只是一个参考而已,既然已经配出来了,我想最重要的还是配置过程中自己 的思考,而不是死板地按照网上的教程一步步下来,起码要知道它每一步的意义,要学会甄别并自己改正网上教程的错误,从迷雾中看见光芒。

  • 相关阅读:
    CentOS 上配置 lua 的服务器环境(enet)
    报错解决 unable to unroll loop, loop does not appear to terminate in a timely manner (994 iterations) or unrolled loop is too large, use the [unroll(n)] attribute to force an exact higher number
    开源许可证的选择
    Lua 协程
    [命令模式]在游戏开发中的应用
    NGUI 源码分析- AnchorPoint
    NGUI 源码分析- UIWidgetInspector
    Java程序员需要学习的知识点
    Linux下安装Perl和Perl的DBI模块
    Linux安装JDK
  • 原文地址:https://www.cnblogs.com/tianlangshu/p/5662115.html
Copyright © 2020-2023  润新知