2

これに関するすべての質問を確認し、ボトルのチュートリアルを確認し、ボトルの Google グループのディスカッションを確認しました。私の知る限り、すべて正しく行っています。しかし、どういうわけか、CSS ファイルを正しくロードできません。静的ファイルで 404 が表示されますhttp://localhost:8888/todo/static/style.cssが、これは見つかりません。以下のディレクトリ構造によると、これは当てはまりません。ボトルのバージョン 0.11 (不安定) を使用しています。不足しているものはありますか、それともボトルのバグですか?

私のディレクトリ構造:

todo/
   todo.py
   static/
      style.css

私の todo.py:

import sqlite3
from bottle import Bottle, route, run, debug, template, request, validate, static_file, error, SimpleTemplate

# only needed when you run Bottle on mod_wsgi
from bottle import default_app
app = Bottle()
default_app.push(app)

appPath = '/Applications/MAMP/htdocs/todo/'


@app.route('/todo')
def todo_list():

    conn = sqlite3.connect(appPath + 'todo.db')
    c = conn.cursor()
    c.execute("SELECT id, task FROM todo WHERE status LIKE '1';")
    result = c.fetchall()
    c.close()

    output = template(appPath + 'make_table', rows=result, get_url=app.get_url)
    return output

@route('/static/:filename#.*#', name='css')
def server_static(filename):
    return static_file(filename, root='./static')

私のHTML:

%#template to generate a HTML table from a list of tuples (or list of lists, or tuple of tuples or ...)
<head>
<link href="{{ get_url('css', filename='style.css') }}" type="text/css" rel="stylesheet" />
</head>
<p>The open items are as follows:</p>
<table border="1">
%for row in rows:
  <tr style="margin:15px;">
  %i = 0
  %for col in row:
    %if i == 0:
        <td>{{col}}</td>
    %else:
        <td>{{col}}</td>
    %end
    %i = i + 1
  %end
  <td><a href="/todo/edit/{{row[0]}}">Edit</a></td>
  </tr>
%end
</table>
4

2 に答える 2

5

私はあなたの展開をよく理解していません。/Applications/MAMP/htdocs/パスは、コードに が含まれていないため、これapp.runを Apache で実行していることを示しています。本番環境への導入ですか? 開発タスクの場合、Bottle の組み込み開発サーバーを使用することになっています。app.run()の最後にシングルを追加todo.pyすれば完了です。

Apache を使用している場合、最も可能性の高い根本的な原因は次の行ですstatic_file(filename, root='./static')。mod_wsgi では、作業ディレクトリがtodo.py配置されているディレクトリと同じであるという保証はありません。実際、それはほとんどありません。

データベースとテンプレートに絶対パスを使用しています。静的ファイルにもそうしてください。

@route('/static/:filename#.*#', name='css')
def server_static(filename):
    return static_file(filename, root=os.path.join(appPath, 'static'))

次に、あなたのアプリがどこにマウントされているかわかりません。URLhttp://localhost:8888/todo/static/style.cssは、マウント ポイントが であることを示唆していますが、ハンドラー/todoのルートは再びです。フル パスは であるはずですか? アプリにハンドラーはありますか?todo_list/todohttp://localhost/todo/todo/

また、パスをハード コーディングしたり、パス フラグメントを連結したりすることを避けることをお勧めします。これはよりきれいになります:

from os.path import join, dirname
...
appPath = dirname(__file__)

@app.route('/todo')
def todo_list():
    conn = sqlite3.connect(join(appPath, 'todo.db'))
    ...
于 2012-06-04T21:42:30.550 に答える
0

それは Bottle とは何の関係もなく、すべてはアプリケーションをロードした wsgi ファイルと関係があることがわかりました。os.path を正しいパスに変更しませんでした。wsgi スクリプトが置かれているフォルダーを指していました。明らかに、そこには css ファイルはありませんでした。sgi スクリプトでディレクトリを修正すると、すべてが機能しました。言い換えると:

os.chdir(os.path.dirname(__file__))

する必要があった

os.chdir('Applications/MAMP/htdocs/todo')

私の wsgi スクリプトは、アプリケーション自体とは別のディレクトリにあったためです (mod_wsgi はこの方法をお勧めします)。みんな助けてくれてありがとう!

于 2012-06-05T19:02:32.757 に答える