gardentr
@gardentr

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

bottleでtemlpate関数を使ったらエラー500が出る

解決したいこと

プログラミング初心者です。
PythonのbottleをつかってWebアプリを作っています。
template関数をつかったらエラー500がブラウザに表示されます。
テンプレートファイルの表示方法を教えてください。

発生している問題・エラー

Error: 500 Internal Server Error
Sorry, the requested URL 'http://localhost:8080/' caused an error:

Template 'index' not found.

フォルダー構造

timer
 |―app.py
 |―views
   |―index.html

該当するソースコード

from bottle import route, run, template

@route("/")
def index():
    return template("index")

if __name__ == "__main__":
    run(host="localhost", port=8080, debug=True, reloader=True)
<!DOCKTYPE html>
<html>
    <head>
        <meta>character=utf-8"</meta>
        <title>テンプレートエンジン</title>
    </head>

    <boddy>
        <h1>Hello</h1>
    </boddy>

    <footer>
    </footer>

</html>

自分で試したこと

template("views/index")とtemplate("./views/index")、htmlファイルの拡張子を.tplに変えてもエラーが表示されました

0

3Answer

ほぼ同じエラーで悩んでいましたが、macOSではダメだったものが、Windowsだと全く問題なく動作しました。もしかしてmacOSでやっておられませんか?

1Like

Comments

  1. @gardentr

    Questioner

    残念ながらWindowsです

提供いただいたHTMLコードにいくつかの問題が見られます。以下が修正版です:

<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8">
        <title>テンプレートエンジン</title>
    </head>

    <body>
        <h1>Hello</h1>
    </body>

    <footer>
    </footer>
</html>
  1. 最初の行のDOCTYPEのスペルを修正しました。
  2. タグを修正し、charset属性を正しく指定しました。元々提供されていたものではなく、charset="utf-8 になっています。
  3. <body> セクションの開始と終了のタグを修正しました。これは と ではなく、 と になっています。
    提供されたままの セクションを保持しましたが、後でコンテンツを追加することを想定しています。
0Like

Comments

  1. @gardentr

    Questioner

    回答ありがとうがざいます。
    ご指摘いただいた箇所を修正してもう一度VScodeで実行しましたが同じエラーが出ました。
    一旦VScode内でhtmlファイルのプレビューを表示してからならブラウザーで開けました。

  2. 不思議なことに、私は同じPythonコードと修正されたHTMLコードを使用しています。 python3 app.pyを実行すると、プログラムが直接起動します
    截屏2023-08-08 16.43.11.png

  3. @gardentr

    Questioner

    一応、再起動してから実行してみましたがダメでした。
    もしかしたら、こちらのPC環境設定になんらかの問題があるのかもしれません。色々とチェックしてみます。

  4. @gardentr

    Questioner

    無事ブラウザで表示できました。原因はHTMLコードだけでなく前提にかいたフォルダー構造にもありました。
    正しくは
    PROJECT1
    |-timer
    |―app.py
    |―views
       |―index.html
    でした。app.pyとviewsをPROJECT1へ移動させたら表示されました。
    お手数をおかけしました。ありがとうございます。

机上です。

from bottle import route, run, static_file
@route('/views/')
def static(file_path):
    return static_file(file_path, root='/.../')
 
if __name__ == "__main__":
    run(host='localhost', port=8080, debug=True, reloader=True

···がviewsに置き換えされます。ので

@route('/')
def static(file_path):
    return static_file(file_path, root='/views/')

でも良いかも?

@route('/')
def static(file_path):
    return static_file(file_path, root='views/')

root='···views/' と思ったが

レンダリングも同じように置き換えて下さい。

私はreturn render_templateの
flaskの方が好きです。

0Like

Comments

  1. @gardentr

    Questioner

    回答ありがとうございます。
    ご提案いただいたコードで実行したところ下記の文章が出てきてしまいました。
    どうすればいいんでしょうか。
    申し訳ないですが、VScodeを使っていることを伝え忘れていました。

    Exception:
    TypeError("static() missing 1 required positional argument: 'file_path'")

    Traceback:
    Traceback (most recent call last):
    File "C:\Users\ユーザー名\AppData\Local\Programs\Python\Python311\Lib\site-packages\bottle.py", line 876, in _handle
    return route.call(**args)
    ^^^^^^^^^^^^^^^^^^
    File "C:\Users\Yousuke\AppData\Local\Programs\Python\Python311\Lib\site-packages\bottle.py", line 1759, in wrapper
    rv = callback(*a, **ka)
    ^^^^^^^^^^^^^^^^^^
    TypeError: static() missing 1 required positional argument: 'file_path'

  2. def static(filename):
    def server_static(filename):
    

    staticはpythonの予約語? 机上です。

    @route('/static/<file_path:path>')
    次のurlを参考にしてください。

  3. @gardentr

    Questioner

    参考urlありがとうございます。これを読んで勉強してみます。

Your answer might help someone💌