Windows里折腾Django,XAMPP,SQLServer
最近楞是想往Windows里搭个django, DB用SQLServer 2ksp4. App Server用XAMPP的Apache,折腾了一下终于搭起来了…
环境选择
Python 机器上装的是2.6系的最新版,django用最近的release. Xampp用最新release; 稍微调查了下,发现数据库连接用pyodbc比较靠谱, 配上django-pyodbc正合适。 所以环境就是如此了:
- xampp: 1.7.3
- Python: 2.6.5
- django: 1.1
- pyodbc: trunk
- django-pyodbc: trunk
其实按照Django自己的说法,用svn trunk也没什么问题的。
数据库配置
既然是odbc模式,自然要在Windows host配置好odbc连接SQL Server 数据库。 django项目的settings.py是这样写的:
DATABASE_ENGINE = 'sql_server.pyodbc' DATABASE_NAME = 'db_name' # 数据库名 DATABASE_USER = 'sa' # 用户名 DATABASE_PASSWORD = '' # 密码 DATABASE_HOST = '' DATABASE_PORT = '' DATABASE_OPTIONS= { 'driver': 'SQL Server', 'MARS_Connection': True, # ODBC支持MARS Connection 'dsn': 'test', # 你在odbc里连接的dns
Web Server 配置
我用的是xampp的apache + mod_wsgi 项目目录被我放到了xampp目录下,按照Django doc的推荐,项目内建了一个apache目录.大致结构如下:
C:\-----xampp
|
+----myproject
|
+----apache
| |
| +--django.wsgi
|
|---settings.py
|
|---__init.py__, menage.py, urls.py...
整个项目位于域名的myproject子目录。apache的httpd.conf里把wsgi的脚本路径写上:
WSGIScriptAlias /myproject "C:/xampp/myproject/apache/django.wsgi" <Directory "D:/xampp/bizquery"> Order deny,allow Allow from all </Directory>
注意我用的是”/”, 即便是Windows的Apache也是如此表达路径,且不要忘了双引号。
既然系统是Windows,所以访问控制就全靠apache了
静态内容hosting
这个是比较麻烦的,Django doc推荐其他的web server专门host静态文件。现在既然是XAMPP了,就一起host了吧。 我的目录结构里再加了一个静态文件目录”static”, 下面有一个media目录,其中img目录放图像;js放javascript(赛个jQuery嘛~~), uploads放上传文件,styles放css, 结构如下:
C:\-----xampp
|
+----myproject
|
+----apache
| |
| +--django.wsgi
|
|---settings.py
|
|---__init.py__, menage.py, urls.py...
|
+----static
|
|----media
| |
| |--img
| |
| |--uploads
| |
| +--js
|
|
+--styles
相应的httpd.conf里面加上这些内容:
Alias /myproject/favicon.ico "C:/xampp/myproject/static/media/favicon.ico" AliasMatch /([^/]*\.css) "C:/xampp/myproject/static/styles/$1" Alias /myproject/media/ "C:/xampp/myproject/static/media/" Alias /myproject/uploads/ "C:/xampp/myproject/static/uploads/" <Directory "D:/xampp/bizquery/static"> Order deny,allow Allow from all </Directory>
这同样参考了参考Django doc: favicon专门对待, css用AliasMatch正则穷举, media对应/media。
再把settings.py的MEDIA_ROOT和MEDIA_URL对应的设置好:
MEDIA_ROOT = 'D:/xampp/bizquery/static/media/' MEDIA_URL = 'http://myhost.com/myproject/media/'
这样对于上传的文件model,即可指定上传路径:
class File(models.Model): name = models.CharField(max_length=64, verbose_name='文件名称') path = models.FileField(upload_to="files/%Y/%m/%d", blank=True, null=True, verbose_name='文件' ...
在Admin Interface里就可以上传文件了。
后记和问题
测试环境
建议再留个sqlite 数据库配置测试用,sqlite是很好用的prototyping工具,不论你在什么数据库上做东西。sqlite数据库文件可以进版本管理系统,DB文档和脚本都省了
! 我的配置文件里就有:
import os HOST_NAME = socket.gethostname() if HOST_NAME != 'testing PC': #....你的正常配置.... else: DATABASE_ENGINE = 'sqlite3' DATABASE_NAME = 'myproject.sqlite3'
既然settings是一个py,这里判断一把hostname来依据机器名来设置不同的配置。不光数据库,MEDIA_ROOT,MEDIA_URL之类统统都可以这样都写好。
Windows文件名问题
在Admin Interface里上传文件遇到个问题,就是上传中文文件名或者任何非拉丁文件名的文件,
admin的url并没有quote成”%A%B%X…“的形式,我也不知道哪里有设置,也许开发者忽视了.
目前没有解决,可能要hack一下…admin interface拿来直接用还是会有问题的…
此外,windows 2003 server的文件名是gb13810的,而我的django项目是纯utf-8.当中还要经过一次转码。 不过这个问题倒是好办,看你的静态文件hoster怎么设置了,apache的话就直接
AddDefaultCharset utf-8
应该就可以了… Windows目前我唯一不爽的就是没有一个Linux那样的utf-8环境。有空可以开始在Windows上做web了…
还有…SQLServer支持foreign_key…慎用…你完全可以model里用foreign_key而真实的数据库里把constraints删掉…我倒是希望像SQLite那样默认不支持…

Discussion