私は最近、とても良いと思う Web2py フレームワークに飛び込みました。しかし、私は今、「基本的な」問題で立ち往生しています。
環境
私が構築している Web サイトは、科学コードのインターフェイスです。人々はフォームに入力して送信します。データ (共有フォルダー内のファイルに書き込まれる) は、コードによって処理され、バックグラウンドでデーモンとして実行されます (この共有フォルダーと 間の JSONRPC リンクを除いて、コードには Web サイトとのリンクはありませんcode->website
)。このコードは、Web サイトのユーザーが利用できるようにしたいファイルと画像を生成します (つまり、ユーザーが要求した結果を返します)。ジョブが完了すると、コードは完全に機能する JSONRPC サービス リンクを使用して結果を Web サイトに「プッシュ」します。結果は、基本的に次の構造を持つ生成された名前のフォルダーにあります。
unique_folder_name/
file1.txt
file2.csv
file3.xls
image1.png
image2.png
現在の実装 (正しく動作していません)
現在、私は3つのDBを持っています:
# Job database
db.define_table("job",
Field('owner', 'string', length=60, required=True, writable=True, readable=True),
Field('uniq_id', "string", length=60, required=True, unique=True, writable=False, readable=True))
# Result database
db.define_table("result",
Field("job", "reference job"),
Field("x", "integer", default=1),
Field("y", "integer", default=0),
Field("z", "integer", default=0),
Field("data", "string", length=500),
Field("message", "string", length=200))
# File database
db.define_table("file",
Field("job", "reference job"),
Field("file", "upload"),
Field("isimage", "boolean", default=False))
コードが結果を「プッシュ」すると、Web2py の一部のモジュールが「結果」データベースにエントリを作成し、ジョブに関連付けられた「ファイル」データベースにエントリを作成します。アップロード フォルダーにコピーせずにファイル (既にファイル システムにある) を Web2py で使用できるようにする方法が見つからなかったため、現在、そのようなファイルを (モジュールに) 保存しています。
stream = open(os.path.join(directory, _file), 'rb')
current.db.file.insert(job=jid, file=current.db.file.file.store(stream, _file), isimage=isimg)
次に、画像を使用してビューを作成する場合は、(モジュール内で) 次のようにします。
rows = current.db((current.db.file.job==jid) & (current.db.file.isimage==True)).select()
for row in rows:
div.append(I(_src=URL(c="default", f="download", args=os.path.join(directory, row.file)), _width="500", _height="500"))
およびビュー内: `{{=div}}`
問題
これは機能していません...表示されたページのソースコードは次のようになります。
<i height="500" src="/mycode/default/download//path/to/directory/file.file.9b7d3a0367de0843.6d732d72732e706e67.png" width="500"></i>
この URL をアドレス バーに入力すると、ファイルは正しくダウンロードされますが、それ以外の場合、画像は Web ページに表示されません。また、Web2py がファイルを 'upload' フォルダー (新しい安全な醜い名前で:)) にコピーしたとしても、ファイルのパスを指定する必要があります。そうしないと、リンクが機能しません。したがって、画像は表示されず、ファイルはとにかく「アップロード」フォルダーにコピーされます:(
私は迷っており、これを修正する方法がわかりません。(画像の URL を作成するときにリクエスト オブジェクトを追加しようとしましたが、カスタム ダウンロード機能も試しましたが、これまでのところ機能していません)。
編集(解決策)
さて、私が見逃していた私のコードには明らかなバグがあります: images tag helper is not I
, しかしIMG
:) アイコンの Twitter ブートストラップで使用されるタグとの混乱から生じる単純な間違いI
...それで表示の問題は解決します。アップロード フォルダーにファイルをコピーせずにファイルをストリーミングする (つまりupload
、DB のフィールドを使用しない) ために、rochacbruno (彼に感謝します) は私を正しい軌道に乗せました。完全な解決策については、私自身の回答を参照してください。