0

私はREST json APIにdjango-pistonを使用しています.generate_doc関数に組み込まれたピストンを使用して、ドキュメント用にすべて設定しています。django runserver の下では、うまく機能します。doc オブジェクトをループするテンプレートは、クラスと各メソッドの両方の docstring を正常に一覧表示します。

nginx と uwsgi を介してサイトを提供すると、docstring が空になります。最初は、これは django マークアップ フィルターと restructuredtext フォーマットの使用に問題があると思っていましたが、それをオフにして、単純にテンプレート内の生の docstring 値を確認しようとすると、それらは None です。

ログに問題は見られず、なぜここで nginx/uwsgi が要因なのか理解できませんが、正直なところ、dev runserver ではうまく機能します。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 でのこのテンプレートのレンダリング結果は、Noneにdoc.docなります。method.docフィルターを削除して、生の値をチェックしてこれを確認しようとしました。

問題は 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
  • ジャンゴ非関連 1.3.1
  • ジャンゴピストン最新のpypi 0.2.3
  • パイソン2.7
4

1 に答える 1

1

uWSGIは、Pythonコマンドラインの-OOオプションと同等の方法でインタープリターを起動しています。この第2レベルの最適化では、ドキュメント文字列が削除されます。

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

変化する:

--optimize 2

に:

--optimize 1
于 2012-01-14T21:24:26.703 に答える