質問編集履歴

1 タイトル変更

marugo128

marugo128 score 8

2017/09/07 15:49  投稿

NginxでPOST 405エラー
Nginx + uwsgi +Flask でPOST時に405エラー
**■前提**
以下のシステム構成でWebアプリケーションを作成していまして、ページ遷移のルーティング用コードを記述しましたが
post実行時に405エラーがでましたのでご存知の方でご教示頂けますと幸いです。
(エラーが出たのでGETに変更した際は400エラーBad Requestになり、どこを変更すれば良いか分からなく質問させて頂きました。)
**■実現したいこと**
以下URLを表示させたい。
example.com/login
(index.htmlは表示できていますが、上記URLを叩くとlogin()関数内でPOST/GETを確認しているが、上記のエラーが出ます)
**■システム構成**
OS:CentOS 7(VirtualBoxでのゲストOS)
言語:Python3.6.1
WEBサーバー:Nginx 1.12.1
WSGIサーバー:uWSGI 2.0.15
Webフレームワーク:Flask 0.12.2
テンプレートエンジン:Jinja2
###発生している問題・エラーメッセージ
```
■POST時 405 Method Not Allowed
The method is not allowed for the requested URL.
以下、アクセスログ
[pid: 5397|app: 0|req: 1/1] 192.168.**.* () {44 vars in 771 bytes} [Thu Sep 7 **:**:** 2017] GET /login => generated 178 bytes in 6 msecs (HTTP/1.1 405) 3 headers in 103 bytes (1 switches on core 0)
---------
■GET時 400 Bad Request
The browser (or proxy) sent a request that this server could not understand.
以下、アクセスログ
[pid: 5227|app: 0|req: 1/1] 192.168.**.* () {44 vars in 771 bytes} [Thu Sep 7 **:**:** 2017] GET /login => generated 192 bytes in 7 msecs (HTTP/1.1 400) 2 headers in 74 bytes (1 switches on core 0)
```
###該当のソースコード
```Python
#/var/www/testapp/app.py
import os
from flask import Flask,render_template,request,redirect,url_for,send_from_directory,session
from werkzeug import secure_filename
app = Flask(__name__)
app.config['SECRET_KEY'] = os.urandom(24)
@app.route('/')
def index():
if 'username' in session:
return render_template('index.html')
else:
return "<p> ログインしてください </p>"
#GETの時はmethodsをGETに変更
@app.route('/login',methods=['POST'])
def login():
if request.method == 'POST':
username = request.form['username']
if username == 'admin':
session['username'] = request.form['username']
return redirect(url_for('index'))
else:
return render_template('login.html',message="No user")
@app.route('/logout')
def logout():
session.pop('username',None)
return redirect(url_for('index'))
```
```html
<!-- /var/www/testapp/templates/index.html -->
{% extends "base.html" %}
{% block content %}
<p>indexページ</p>
{% endblock %}
```
```html
<!-- /var/www/testapp/templates/base.html -->
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<link rel="stylesheet" href="/static/css/skeleton.css">
<link rel="stylesheet" href="/static/css/style.css">
<title>アップロード</title>
</head>
<body>
<div class="container">
<div class="row">
{% block content %}
{% endblock %}
</div>
</div>
</body>
</html>
```
```html
<!-- /var/www/testapp/templates/login.html -->
{% extends "base.html" %}
{% block content %}
{{ message }}
<form action="#" method="GET">
<p><input type="text" name="username"></p>
<p><input type="submit" value="Login"></p>
</form>
{% endblock %}
```
###試したこと
過去の事例を調べましたら、Nginxで静的ファイルをPOSTで取れないとの記事を見つけました。
http://d.hatena.ne.jp/pullphone/20121116/1353054974
上記のURL参考にNginxのコンフィグファイル(default.conf)に以下を追記
error_page 405 = $uri;
```nginx
server {
listen 80;
server_name example.com;
location / {
include uwsgi_params;
uwsgi_pass unix:///tmp/uwsgi.sock;
error_page 405 = $uri;
}
}
```
以下はuWSGIのiniファイルです。(こちらのファイルは変更はしていません)
```nginx
[uwsgi]
module = app
callable = app
master = true
processes = 1
socket = /tmp/uwsgi.sock
chmod-socket = 666
vacuum = true
die-on-term = true
```
■**結果エラー等に変化ありませんでした。**
###補足情報
  • Python

    38038 questions

    Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

  • nginx

    1880 questions

    nginixは軽量で高性能なwebサーバーの1つです。BSD-likeライセンスのもとリリースされており、あわせてHTTPサーバ、リバースプロキシ、メールプロキシの機能も備えています。MacOSX、Windows、Linux、上で動作します。

  • Flask

    999 questions

    FlaskはPython用のマイクロフレームワークであり、Werkzeug・Jinja 2・good intentionsをベースにしています。

思考するエンジニアのためのQ&Aサイト「teratail」について詳しく知る