All articles, tagged with “django”

HTTPS django-cpserver 和 Nginx 反向代理

最近把内部 blog 也迁移到了 Byteflow, 并在 Webfaction 设置使用 HTTPS 协议.

一般的页面浏览均正常, 但是对于登录 admin 控制台或是保存编辑操作, Django 重定向机制会跳转到 HTTP 协议, 而不是预期的 HTTPS.

内部 blog 也是用 django-cpserver 跑, HTTPS 请求先经由 Webfaction 主 Nginx 反向代理服务器过滤.

由于 Nginx 接管了 HTTPS 加密/解密, 并把用户请求作为普通 HTTP 请求进行转发, 所以 django-cpserver 和 Django 对 HTTPS 一无所知, request.is_secure() 将总是返回 False.

修正方法

用一个简单的 WSGI Middleware 修改请求对象:

class SSLMiddleware(object):
    """
    Middleware that applies some fixes for people using
    Nginx manage HTTPS and forward requests as HTTP to
    backend server.
    """
    def process_request(self, request):
        # use HTTPS forever
        request.is_secure = lambda: True == True

将以上代码保存成 .py 文件, 并追加到 Django settings.py 文件 MIDDLEWARE_CLASSES 元组中, 重启后台服务器生效.

2009-08-29, Saturday 20:37 PM | 2 comments | 0 pingbacks | Tags: , , ,

Django 和时区设置的问题

Django 1.1 及其之前的版本, 时区处理这一块算是比较混乱的了:

  1. 依赖数据库管理系统本身 (Django 针对 PostgreSQL 做了特殊处理)
  2. 跨平台能力弱 (Python 标准库的 TZ 环境变量依赖 *nix 操作系统)
  3. Windows 下, settings.TIME_ZONE 的值直接被忽略, Django 将使用系统默认本地时间
  4. settings.TIME_ZONE 推荐的值本身缺乏可移植性, 至少在 Webfaction 提供的 Linux 主机中, 无法识别推荐的 ‘Asia/Shanghai PRC 时区, 设置为 ‘Asia/Shanghai’ 则正常
  5. 没有提供一个统一的时区 API 和相关 Filter, 导致不同 app 在时区处理处于各自为政的状态, 有的是将 UTC 时间存入数据库, 有的则把本地时间存入数据库
  6. 单一的时区设置 — 多用户模式下, 不支持用户自定义时区

相关的 Bug 报告:

相关研究:

规避

大部分情况下, 都不太需要更改本地时区, Django 当初设计的时可能也是这么考虑的.

但是, 使用本地时间存数据库显然是缺乏灵活性的. 尤其是美国, 采用多个时区不说, 根据夏令/冬令时段还会调整时间.

Bug #2626 表明 Django 正在努力改进时区处理. 但在 Django 完成改进之前, 新开发的 app, 在不考虑多用户的情况下, 最好是: 把 UTC 时间存入数据库, 前台 view 或 template 再根据设置的显示时区呈现, 尽可能使用 pytz.

参考: Google App Engine 中通过自定义Django的filter解决时区问题

多用户的情况

如果应用是国际化的, 用户地域分布广, 目前 Django 的时区处理功能还无法满足, 需要借助第三方 app : django-timezones

2009-08-19, Wednesday 11:32 AM | 3 comments | 0 pingbacks | Tags: ,

Blog 改动备忘录

远足回来, 惊讶的发现 Picasa Web 也被墙奸了…

真是无奈, Zine 不支持附件上传, 所以 Blog 的照片基本都存放在 Picasa Web 上.

Picasa Web 最近不断抽筋, 不过根据以往的经验, 把希望寄托在 GFW 上是无知的, 更靠谱的方法还是换一个支持附件上传的 Blog 引擎.

  • 切换到 Byteflow, 支持图片上传

  • 使用 virtualen + django-cpserver + supervisor 的组合部署 Django / Byteflow

  • 安装 django-cpserver, 在 settings_local.py 文件 ADDITIONAL_APPS 中追加: ‘cpserver’

  • settings_local.py 文件 ADDITIONAL_APPS 中启用: nebulafriends apps

  • 主题转换

  • settings_local.py 时间, 日期格式:

    DATE_FORMAT = "Y-m-j, l"
    TIME_FORMAT = "H:i A"
    
  • settings_local.py 文件, 设置 reStructuredText 格式: RENDER_METHOD = ‘rst’

  • settings_local.py 文件, 设置时区: TIME_ZONE = ‘Asia/Shanghai’

  • settings_local.py 文件, 设置 SMTP 邮件信息:

    EMAIL_HOST = 'smtp.webfaction.com'
    EMAIL_HOST_USER = 'xxxxxxx'
    EMAIL_HOST_PASSWORD = 'xxxxxx'
    EMAIL_PORT = 25
    DEFAULT_FROM_EMAIL = 'xx@yy.com' # from address for server error emails
    SERVER_EMAIL = 'donot-reply@yy.com' # used as the from address for django.core.mail.mail_admins() and django.core.mail.mail_managers()
    
  • settings_local.py 文件, 把 DEBUG = True 修改成 DEBUG = False

  • FeedBurner 自动转向: FEEDBURNER = {“blog.yangyubo.com”: {“blog” : “yangyubo”, “comments” : “yangyubo_comments”} }

  • 修改 app/discussion/models.py, 将 self.body_html = render(self.body, ‘markdown’) 修改成 self.body_html = render(self.body, ‘rst’)

  • 修改 static/js/comments.js, 在 function init() 中, 注释掉 comment_form.hide(); 一行

  • 在 Webfaction 控制面板中添加 admin-media, static 等静态资源映射

2009-08-16, Sunday 15:07 PM | 2 comments | 0 pingbacks | Tags: , , ,

对 Python 最友好的虚拟主机 - Webfaction

国外便宜量又足的虚拟主机服务有很多, Bluehost / DreamHost 等等. 但是如果你部署的是 Python 或是 Ruby 应用, Webfaction 是目前为止见过最我令人满意的虚拟主机. 相对其它廉价主机服务, 它要贵上 $2/月, 但这是值得的:

  • 它是 Django Friendly 评价最高的虚拟主机;
  • 所有主机里 Python / Django 和 Ruby / RoR 部署最快, 最简单的;
  • Nginx 前端;
  • 支持运行自己的后台守护程序;
  • 实打实的存储空间和流量;
  • 2个月的退款保证;
  • 更少的用户分享一台真实主机;
  • 一键安装 Trac + Subversion;
  • 其它主机商有的功能, 它做得更易用;
  • … 更多 …

Webfaction 是一个对程序员友好的主机空间, 这个空间性价比比较高, 它宽松的限制让你感觉在使用一台 VPS. 或许你应该 试一试.

2009-05-14, Thursday 15:13 PM | 4 comments | 0 pingbacks | Tags: , ,

看好 Django 和 Werkzeug

开发框架的繁荣通常从侧面反映了这门编程语言的广泛接受程度, Java, C++, PHP 都各有不少开发框架.

Python 则是有过之而无不及 — Web Frameworks for Python, 这只是其中一部分, 还有很多其它大大小小的土制框架.

Python Web 开发框架的空前繁荣得益于 WSGIPEP 333 规范, WSGI 定义了服务器/网关如何同 Web 应用 交换数据, 它还更进一步的明确了中间件的行为, 使中间件能够被复用. 下图用洋葱形象的描述了 WSGI 的请求处理 (来自 Pylons 文档) :

http://www.pylonshq.com/docs/en/0.9.7/_images/pylons_as_onion.png

WSGI 规范让 Web 开发的各个要素自由组合成为可能, 利用各种现有的库装配出自己满意的 Web 框架也不是件太难的事情 — A Do-It-Yourself Framework.

Python 社区不断生产出新的 Web 框架, 快得让人窒息, 以致很多人, 包括我都曾希望挂掉几个. 后来想想这可能未必是件坏事, 虽然分散了社区资源, 但也利用了闲散的智力资源, 不同的框架之间可以也相互借鉴和给予灵感, 催生一个更开放, 更繁荣的社区.

Django

众多框架中, 个人感觉社区势头比较好的是 DjangoZope 系 (Zope3, Grok, Repoze.bfg). Pylons / Turbogears 等框架虽然灵活, 但并没有很好的解决复用问题. Django 的 app 复用机制和 Zope 系的组件机制是目前所有框架中最完整的方案.

DjangoZope 系之外的大部分框架, 各具特色的同时, 其实也都大同小异 — 都符合 WSGI 规范, 而且都没能很好的处理复用.

Django 很适合用来快速搭建在线社区, django-registration / django-profiles / pinax 等大量现成的 app 可以整合利用.

不过独立应用软件是 Django 的弱项, 比如类似 Wordpress / MoinMoin 这类软件.

Django 没有对普通用户提供特殊照顾, 所有的设施都是面向开发人员的. 我试过 Byteflow, 一个基于 Django 的 Blog 引擎, 部署方式还是过于原始, 非 Django 开发人员不容易搞定. Byteflow 虽然提供很多特性, 但易用性是最大的问题: 我不能在管理后台修改一些常用配置, 每次 Byteflow 更改配置都需要重启 Django 服务, 相比之下 Zine 易用的多, 插件和主题支持也比较完善.

WSGI + Werkzeug + Jinja2

如果 Django 不适合做一个小的应用或者独立应用软件的话, 谁更适合呢? 有很多不同的选择, 我倾向于 WSGI + Werkzeug + Jinja2, 和 Sphinx / Pygments 一样, WerkzeugJinja2 都出自 pocoo 团队.

Werkzeug 在德语里面是 “工具” 的意思, “Colubrid” 项目的后续, 不属于开发框架的范畴, 但它是相当成熟和完整的 WSGI 工具模块. 比较成功的独立应用软件如 ZineMoinMoin 1.9 都是基于它. 和 Paste 一样, Werkzeug 可以用来整合不同的 WSGI 中间件, 搭建自己的私有平台或框架.

Jinja2 是 Jinja 的后续版本, 它和 Django 模板非常相似, 但是没有 Django 模板的种种限制, 比如不能调用函数, 不能使用 Python 语句等. Jinja2 的性能比 Jinja 有很大的提高, 作者的测试结果是仅次于 Mako.

很多人误认为 Jinja 模板系 “日货”, 并以为是指 靖国神社. 其实作者 Armin Ronacher 是奥地利人, 年纪不大, 却主导和参与了很多比较有影响的开源项目: http://lucumr.pocoo.org/projects/. 他经常使用 mitsuhiko (圆谷光彦) 这个 ID, 搞得我有段时间也以为他是日本人. Armin 好像会些日语, 可能对日本文化也是颇为神往.

英文中 Template (模板) 和 Temple (庙宇) 有相似的发音, 这位兄弟就联想到了日本的 Jinja (神社, 庙宇), 蛮有创意的. 不过一般的 神社 和伤害中国人民感情的 靖国神社 不是一码事.

MoinMoin 2.0 很有可能会采用 Werkzeug + Jinja2 + Pygments 的组合.

2009-05-13, Wednesday 14:29 PM | 1 comment | 0 pingbacks | Tags: , , , ,

Django 最佳实践 - 中文版

译者 (yospaly) 前言

Django 最佳实践 (django-best-practices) 是 django-reusable-app-docs 的一个分支项目, 它在原有项目的理念上进行了扩展, 建立了一套关于 Django Web 开发方面的 “最佳实践” 规则, 这些理念超出了官方文档的讨论范围.

这份文档由一系列准则组成, 围绕这如何创建便于维护, 代码干净, 结构清晰, 方便复用, 易于部署的 Django 项目. 对于初学者, 它是一份不可多得指南, 如果不知道从何下手, 按照文档说做能很快规范起来; 对于经验丰富 Django 达人, 它也有一定的参考价值, 可以据此来创建自己的最佳实践准则.

遗憾的是本人理工科出身, 水平有限, 翻译中规中矩, 只能勉强表达出原文传递的信息. 还有小部分尚不解其意 (文中有备注) :)

原文是多页面方式, 不过 实践 每个规则的内容并不太多, 打散成多页面反而浏览不方便. 所以我把它们全合并到单个页面中, 除此之外, 没做其它改动.

原文和译文的源文件均使用 reStructuredText 格式, 可以用 Sphinx 转换成 HTML 等格式的文档.

Note

中文版力求保持和英文版同步更新. 当前版本 2009-06-17 11:32:35

2009-04-11, Saturday 12:16 PM | 1 comment | 0 pingbacks | Tags: ,

关于 Yang Yubo

身处 IT 行业, 惯用 C/C++, 对 Python 情有独钟, 平时比较关注 QT / Django / Werkzeug 等. 了解更多 »