0

我将 django-piston 用于我的 REST json api,并且我通过 generate_doc 函数中内置的活塞将其全部设置为文档。在 django runserver 下,效果很好。循环遍历文档对象的模板成功地列出了类和每个方法的文档字符串。

当我通过 nginx 和 uwsgi 为站点提供服务时,文档字符串为空。起初我认为这是 django 标记过滤器和使用重组文本格式的问题,但是当我关闭它并只是尝试查看模板中的原始文档字符串值时,它们是无。

我在日志中看不到任何问题,我不明白为什么 nginx/uwsgi 是这里的因素,但老实说,它在开发运行服务器上确实工作得很好。我有点坚持如何通过 nginx/uwsgi 开始调试它。有没有人遇到过这种情况或对我可以从哪里开始寻找建议?

我的文档视图非常简单:

视图.py

def ApiDoc(request):
    docs = [
        generate_doc(handlers.UsersHandler),
        generate_doc(handlers.CategoryHandler),
    ]

    c = {
        'docs': docs,
        'model': 'Users'
    }

    return render_to_response("api/docs.html", c, RequestContext(request))

而且我的模板几乎与库存活塞模板相同:

api/docs.html

{% load markup %}

...

    {% for doc in docs %}

        <h5><a href="#top">top</a></h5>
        <h3><a id="{{doc.name}}">{{ doc.name|cut:"Handler" }}:</a></h3>

        <p>
            {{ doc.doc|default:""|restructuredtext }}
        </p>
...
        {% for method in doc.get_all_methods %}

            {% if method.http_name in doc.allowed_methods %}

            <dt><a id="{{doc.name}}_{{method.http_name}}">request</a> <i>{{ method.http_name }}</i></dt>                

            {% if method.doc %}
                <dd>
                    {{ method.doc|default:""|restructuredtext }}
                <dd>
            {% endif %}

这个模板在 nginx 下的渲染结果将是,doc.doc并且method.doc是 None。我尝试删除过滤器并仅检查原始值以确认这一点。

我猜这个问题必须在 uwsgi 层及其环境中的某个地方。我使用这样的配置运行 uwsgi:

/etc/init/uwsgi.conf

description "uWSGI starter"
start on (local-filesystems
and runlevel [2345])
stop on runlevel [016]
respawn
exec /usr/sbin/uwsgi \
--uid www-data \
--socket /opt/run/uwsgi.sock \
--master \
--logto /opt/log/uwsgi_access.log \
--logdate \
--optimize 2 \
--processes 4 \
--harakiri 120 \
--post-buffering 8192 \
--buffer-size 8192 \
--vhost \
--no-site

我的 nginx 服务器入口位置片段如下所示:

启用站点/mysite.com

server {
    listen 80;
    server_name www.mysite.com mysite.com;

    set $home   /var/www/mysite.com/projects/mysite;
    set $pyhome /var/www/mysite.com/env/mysite;

    root $home;
...
    location ~ ^/(admin|api)/ {
        include uwsgi_params;
        uwsgi_pass uwsgi_main;

        uwsgi_param UWSGI_CHDIR $home;
        uwsgi_param UWSGI_SCRIPT wsgi_app;
        uwsgi_param UWSGI_PYHOME $pyhome;

        expires epoch;
    }
...
}

编辑:配置信息

  • 服务器:Ubuntu 11.04
  • uWSGI 1.0 版
  • nginx版本:nginx/1.0.11
  • django non-rel 1.3.1
  • django-piston 最新的 pypi 0.2.3
  • 蟒蛇2.7
4

1 回答 1

1

uWSGI 以与 Python 命令行的 -OO 选项等效的方式启动解释器。第二级优化删除了文档字符串。

-OO    : remove doc-strings in addition to the -O optimizations

改变:

--optimize 2

到:

--optimize 1
于 2012-01-14T21:24:26.703 回答