dogdog
@dogdog

Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

403エラーの対処法を教えてください

解決したいこと

Pythonとhtmlとデータベースを使って、可変式のwebサイトを作ってます。
「Flask」のrender_templateを使ってます。
ftpソフトの「filezilla」にindex.htmlをアップロードすると403エラーが出ます。

templatesフォルダ内にindex.htmlを置いても大丈夫なように出来ますか?
または、templatesフォルダにindex.htmlファイルを入れずに、render_templateを使う方法はありますでしょうか?

自分で試したこと

index.htmlもapp.pyも読み取り権限を755に設定しても403エラーが出ます。

templatesフォルダ外にindex.htmlを置くとエラーは解消されるのですが、テンプレートを使ったwebサイトを作ることが出来なくなります。

filezillaでの階層 
    -app.py
    -templates
       -index.html

該当するソースコード

app.py
app = Flask(__name__) 

@app.route('/')
def index():
    return render_template('index.html') 

if __name__ == '__main__':
    app.run()
0

4Answer

403 と言ってもいろいろあります。以下の記事は IIS のものですが一読してみてください。

権限の問題ではない可能性もあります。上の記事に書いてあるたくさんの原因を見てその中に思い当たることはありませんか?

1Like

Comments

  1. @dogdog

    Questioner

    コメントありがとうございます。ssl化がされていないのが原因かなと思い、ssl化したのですがやはりエラーが出てきます。頂いたhttp状態コードをひとつひとつ試してみたいと思います。

アップロードできないとのことなのでファイルの所有者とftpで接続しているユーザーが異なり所有者に対してのみ書き込みが許可されているのではないでしょうか

// 権限の確認

templates > ls -l

// 所有者・グループに対してRW許可
// 必要に応じて権限の数字は変えてください

templates > chmod 775 -R .

Linuxの権限の参考記事

1Like

Comments

  1. @dogdog

    Questioner

    コメントありがとうございます。パーミッションで「775」に変更しても変わらずでした。
    ファイルの所有者、グループ名が「14000」みたいに数字のみで書かれており(書き込んでいいのか分からない為具体的な数字は伏せときます。)filezillaのどこにも「14000」の数字、ユーザー名らしきものが見当たりません。
    そもそも自分の名前?(filezillaの)がわからないのですがどのように確認すればいいのでしょうか。コマンドプロンプトで「whoami」と入力すると、「msi¥~」と~の部分は英語で返ってきます。

  2. image.png

    filezillaでサーバーにアクセスする際に上のような画面が表示されたかと思います
    (ネットから画像拾ってきたのでバージョンによっては少し違うかも?)
    その際に入力したユーザー名は自分で決められたものですか?
    (例えば、「root」「ubuntu」などのデフォルトで用意されているユーザー名かお聞きしたいです)

    また、以下のサイトを参考に表示された数字と一致するユーザー名を探して、自分がログイン中のユーザー名と一致するかどうかを調べてみるとユーザー名がわかるかもしれません

    下の方のコメントを見て自分が勘違いしているかもしれないと思ったのですが、403はfilezillaで表示されますか、それともchromeなどのブラウザからアクセスした場合に表示されますか?

  3. @dogdog

    Questioner

    sasanquaさん、コメント本当にありがとうございました。filezillaに入力したのは、xreaサーバーから用意されたユーザー名を使用していました。chromeのブラウザからアクセスした際に403エラーと出ました。権限が用意されていない為に「flask」自体をインストールできていなかったみたいでした。初歩的な事でお手をわずらわせてしまいすみません。

templatesフォルダ外にindex.htmlを置くとエラーは解消されるのですが

これはflaskを実行するwebサーバーがindex.html無しを補正するのではと思います。

flaskは
app = Flask(name)
@app.route('/')
の指定されたurlでindex関数が呼ばれます。

from flask import Flask, render_template
の記述がないのは気になりますが、

http://baseURL/
で表示されるのでは?

サンプルはhttp://127.0.0.1:5000/index
とされています。

因みに、static_folder内がflaskの静的ファイルを配置する場所です。

先ずは次のコードでwebサーバーの定義、ルート定義,import定義に間違いがないか切り分けてください。

app.py
from flask import Flask, render_template
app = Flask(__name__)

@app.route("/")
def index():
    return "Hello index"

if __name__ == "__main__":
    app.run(debug=True)

意外とデホルトのwsgi.pyに記述すると表示されるかも知れません。

1Like

Comments

  1. @dogdog

    Questioner

    回答ありがとうございます。頂いた以下のコードをアップロードした際に「403」エラーが出ました。そもそもapp.pyが認識されていなかったみたいです。
    xreaサーバーを利用しており、そのサーバーにapp.py等をアップロードすれば表示されると思っていました。「wsgi」を使う必要があるんですね。解決の糸口が見えてきました。ありがとうございます。

    app.py
    from flask import Flask, render_template
    app = Flask(__name__)
    
    @app.route("/")
    def index():
        return "Hello index"
    
    if __name__ == "__main__":
        app.run(debug=True)
    
  2. xreaサーバーはcgi対応でwsgi対応ではないようです。

    チョット大変そうですがcgiで受けてmain.pyへリレーしているようです。

    さくらレンタルの方が優秀でず。cgiをwsgiへ変換に努力してます。app.pyへリレーしているようです。

    どちらも、GETのみでPOSTに対応していないようです。cgiとwsgiの壁は高いようです。

    environ['wsgi.input'] = cgiで受けたバイナリデータを環境変数に格納するとPOSTリレーできます。

  3. @dogdog

    Questioner

    HALHaradaさん、コメント本当にありがとうございました。xreaに問い合わせた所、レンタルサーバーであるxreaでは「flask」をインストールできないみたいでした。ご紹介いただいたさくらレンタル等他のレンタルサーバーで試みたいと思います。

  4. レンタルサーバーでyum,apt コマンドでnginx,python3,python3-pip,webServer(uwsgiやgunicorn)がインストールできるレンタルサーバーはwsgi(flaskやdjango)が利用できます。

    php言語のwordpress優先したfastCGI対応レンタルサーバーにご注意ください。

    xreaサーバーでさくらを参考にcgiからwsgi(flaskやdjango)へ変換にチャレンジしては?

403エラーは、ウェブサイトのアクセス拒否を意味するエラーですので、おそらくindex.htmlを置いているディレクトリのパーミッションを755にしてみるとよいと思いますよ。

0Like

Comments

  1. @dogdog

    Questioner

    回答ありがとうございます。パーミッションを755にしても403エラーが発生してしまいます、

Your answer might help someone💌