使用django框架

  cheney

    近期开始学习django的使用,做一个类似Hexo的博客系统是第一个任务。虽然感觉已经入门了但是距做一个应用的程度还有距离。所以打算先做一个基于django的静态网站,这个奇怪的东东将被部署在SAE上,只有那里才需要这种奇怪的方式,我可以在这个系统运行的时候一步一步的完善它,所以这也不完全是一个糟糕的主意。

    ##准备

    • 操作系统使用 Win7
    • 安装 python : http://www.python.org/getit/ 多方面考虑,我安装了 V2.7.6 版本
    • 安装 django : https://www.djangoproject.com/download/ 最开始我装的最新版本V1.6,后来在SAE上总是出问题。看到SAE的支持列表里有V1.5 ,我选择了官方推荐的V1.5.5,还是有问题。最后选择了最保守的版本 V1.2.7。
    • 安装 MySQL : mysql-5.5.13-win32.msi

    ##创建Django工程
    命令:

    django-admin.py startproject mysite
    

    注意命令前面没有 python ,在CMD里移动到目录,直接输就好了。如果提示没有该命令,就因为没有装django或者环境变量没有设置。

    运行,在工程目录下:

    python manage.py runserver 80
    

    在浏览器中打开 localhost,应该能看到“ It worked! ”

    ##新建APP
    一般来说,到了这里就可以创建视图了。但是,为了结构清楚,需要新建一个APP。

    python manage.py startapp showstatic
    

    此时,在项目目录下会自动生成一个APP目录。

    将APP添加到 settings 的 INSTALLED_APPS 中。

    ##视图基于“静态模版”
    showstatic APP 中,新建 views.py。

    from django.shortcuts import render_to_response
    
    def showall(request,uri):
    
        if uri=='' or uri.endswith('/'):
            uri = uri + 'index.html'
        return render_to_response(request,uri)
    

    借用模版,其实我这里模版里没有参数,是纯粹的HTML,只是测试一下。

    用到了模版,所以模版的目录要加到settings里面

    import os
    BASEDIR = os.path.dirname(__file__).replace('\\','/')
    
    TEMPLATE_DIRS = (
    BASE_DIR+'/templates/'),
    
    

    在工程目录下的urls.py 里

    from showstatic import views
    urlpatterns = patterns('',
        url(r'(.*)',views.showall),
        )
    

    之后,将静态的网站拷贝到 templates 目录下,静态网站可以整个的运行了。

    ##静态文件配置

    JS、CSS、Img 等静态文件不适合用django处理。实际应用中需要用服务器配置直接指向一个目录去查找。在本地调试的时候我也喜欢直接在本地也安装ngnix等服务器来提供静态文件。

    django对本地调试也有临时的解决方法:(各种版本改来改去,不建议搞,这里只是做个记录)
    在urls中添加路由

    url(r'^static/(?P<path>.*)$','django.views.static.serve', {'document_root':STATICFILES_DIRS, 'show_indexes': True}), 
    
    

    其中 STATICFILES_DIRS定义在 settings 中,urls 添加

    from settings import STATICFILES_DIRS 
    

    将本地调试需要的静态文件放在对应的APP的static目录下,或 STATICFILES_DIRS 指定的目录下都可以。STATICFILES_DIRS不能与 STATIC_ROOT 相同。

    打开settings.py :
    STATIC_ROOT 就是这个目录。通过命令:

    python manage.py collectstatic
    

    自动将所有静态文件同步至 STATIC_ROOT 目录,供服务器检索。

    ##编码问题
    admin 后台界面显示出来没有样式,静态文件500错误等问题,需要在 settings.py 里增加:

    import sys 
    reload(sys) 
    sys.setdefaultencoding('gbk')
    

    ##数据库
    虽然暂时用不到数据库,但是这个东西总是必须的,现在本地配置好。(包含以后切换到SAE的想法)

    打开 settings.py 将 DEBUG = True 改为:

    DEBUG = not os.environ.get("APP_NAME", "") 
    if DEBUG:
    
        MYSQL_DB = 'sae_goodidea001' 
        MYSQL_USER = 'root' 
        MYSQL_PASS = '' 
        MYSQL_HOST_M = '127.0.0.1' 
        MYSQL_HOST_S = '127.0.0.1' 
        MYSQL_PORT = '3306' 
    else: 
        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
    
    

    将 DATABASE 配置改为:

    DATABASES = {
        'default': {
            'ENGINE': 'django.db.backends.mysql', # Add 'postgresql_psycopg2', 'mysql', 'sqlite3' or 'oracle'.
            'NAME': MYSQL_DB,                      # Or path to database file if using
            'USER': MYSQL_USER,
            'PASSWORD': MYSQL_PASS,
            'HOST': MYSQL_HOST_M,                      # Empty for localhost through 
            'PORT': MYSQL_PORT,                      # Set to empty string for default.
        }
    }
    
    

    用意是自动切换本地和SAE上的运行环境。(SAE上运行时自动去除DEBUG模式,去除DEBUG模式后,在templates 目录下要增加 400.html 500.html )

    本地环境需要自己建个数据库,例如:

    mysql> CREATE DATABASE sae_goodidea001 DEFAULT CHARSET=utf8;
    
    

    然后在项目目录下运行:

    python manage.py syncdb
    
    

    期间会要求输入超级管理员信息,这将是后台登录的帐号和密码。
    一切正常,证明本地数据库环境正确。

    ##admin

    django有个比较好的后台管理模块集成在里面。将urls都改为:

    from django.conf.urls import patterns, include, url
    from django.contrib import admin
    admin.autodiscover()
    
    from showstatic.views import showall
    
    urlpatterns = patterns('',
        url(r'^admin/', include(admin.site.urls)),
        url(r'^()',showall),
        )
    

    settings中:

    INSTALLED_APPS = (
        'django.contrib.auth',
        'django.contrib.contenttypes',
        'django.contrib.sessions',
        'django.contrib.sites',
        'django.contrib.messages',
        'django.contrib.staticfiles',
        'django.contrib.admin',
        'django.contrib.admindocs',
    )
    

    运行dajango ,

    python manage.py runserver 80
    

    访问 localhost/admin/

    ##参考