使用django框架
编程    无    2015-01-23 15:12:34    897    0    0

近期开始学习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/

参考

文档导航