저는 앱 엔진에 대한 문제가 없으며 간단한 채팅 기능을 보일러 플레이트 (https://github.com/coto/gae-boilerplate)에 추가하는 중입니다. 채팅 응용 프로그램은 자체적으로 잘 작동하지만, 상용구에 추가하려고하면 ChatHandler에 채팅 메시지를 게시하려고 할 때 POST POST 메서드 오류가 발생합니다. chatscreen.html은 처음에 ChatHander에서 문제없이 렌더링합니다. 채팅을 게시하려고 할 때 오류가 발생합니다.405 for Google App Engine - POST 메서드가이 리소스에 허용되지 않습니다. - 보일러 플레이트에 추가
{% extends "_base.html" %}
{% block bodycontent %}
<h1>AppEngine Chat</h1>
<form method="post" action="/chat">
<p>
<input type="text" name="message" size="60"/>
<input type="submit" value="Chat"/>
</p>
</form>
{% if not error == None %}
<p>
{{ error }}
</p>
{% endif %}
<div id="chatcontent">
Loading...
<!-- <img src="/static/spinning.gif" alt="Loading..."/> -->
</div>
<script> /* <![CDATA[ */
$(document).ready(function(){
$(function() {
updateMsg();
});
function updateMsg() {
$('#chatcontent').load('/messages');
setTimeout(updateMsg, 5000);
}
});//end doc.onready function
/* ]]> */
</script>
{% endblock %}
: 여기
from webapp2_extras.routes import RedirectRoute
from web import handlers
secure_scheme = 'https'
_routes = [
RedirectRoute('/chat/', handlers.ChatHandler, name='chat', strict_slash=True),
RedirectRoute('/messages/', handlers.MessagesHandler, name='messages', strict_slash=True),
RedirectRoute('/secure/', handlers.SecureRequestHandler, name='secure', strict_slash=True)
]
def get_routes():
return _routes
def add_routes(app):
if app.debug:
secure_scheme = 'http'
for r in _routes:
app.router.add(r)
가 chatscreen.html입니다 : 라우팅 여기
import httpagentparser
from boilerplate import models
from boilerplate.lib.basehandler import BaseHandler
from boilerplate.lib.basehandler import user_required
import cgi
import urllib
import os
import logging
import webapp2
import jinja2
from google.appengine.api import users
from google.appengine.ext import db
from google.appengine.api import memcache
class ChatMessage(db.Model):
user = db.StringProperty()
text = db.StringProperty()
created = db.DateTimeProperty(auto_now=True)
class User(db.Model):
account = db.StringProperty()
user = db.StringProperty()
class ChatHandler(BaseHandler):
def get(self, **kwargs):
params = {
}
return self.render_template('chatscreen.html', **params)
def post(self, **kwargs):
user = self.request.get('user')
self.session['user'] = user
if not 'user' in self.session:
params = {
'error' : 'Must be logged in'
}
return self.render_template('chatscreen.html', **params)
return
msg = self.request.get('message')
if msg == '':
params = {
'error' : 'Blank message ignored'
}
return self.render_template('chatscreen.html', **params)
return
newchat = ChatMessage(user = "temp_user3", text=msg)
newchat.put();
if newchat.put():
chat_list = ChatMessage.all().order('-created').fetch(100) #pulling chat messages to include new ones not yet in memcache
memcache.set('chat_list_key', chat_list, time=2000000)
logging.info('entry added by user -- memcache & datastore updated with new list')
params = {
}
return self.render_template('chatscreen.html', **params)
class MessagesHandler(BaseHandler):
def get(self, **kwargs):
chat_list = memcache.get('chat_list_key') #checking cache for chat_list
# if no chat_list then pull a list from datastore and populate memcache
if chat_list is None:
chat_list = ChatMessage.all().order('-created').fetch(100)
memcache.set('chat_list_key', chat_list, time=2000000)
logging.info('Saving chat_list to memcache *** no messages found')
params = {
'chat_list': chat_list
}
return self.render_template('messagelist.html', **params)
#if chat_list exist then pull data from memcache
else:
params = {
'chat_list': chat_list
}
return self.render_template('messagelist.html', **params)
logging.info('Got chat_list from cache')
class MainHandler(BaseHandler):
def get(self):
user = self.session.get('user')
params = {
'user': user
}
return self.render_template('index.html', **params)
됩니다 : 당신이 여기
을 give- 수있는 조언 덕분에 파이썬 채팅 코드
다음은 messagelist.html입니다.
{% for chat in chat_list %}
<p>
<strong>{{ chat.user}}</strong>:
<br /> {{ chat.text }}
</p>
{% endfor %}
비슷한 문제가 있습니다 (POST는 goe-boilerplate를 사용하지 않을 때 작동하지만 그렇지 않습니다). gae-b에 통합 할 때 작동). 나는 또 다른 질문을 발견했다. http://stackoverflow.com/questions/13020681/gae-boilerplate-documentation 그는 모든 POST 요청에 csrf_token을 포함시켜야한다고 말했다. 웹에서 세션 제어에 익숙하지 않은데, 내 게시물 요청 처리기에 무엇을 추가해야하는지 알고 있습니까? –
그래, 나는 길을 찾는다. 내 경우에는 gae-b의 basehandler에 함수 디스패치가 _csrf_token이 일치하지 않으면 POST를 차단합니다 ... gae-b의 다른 양식 예제에 대한 참조자가 있으며 내 양식에 숨겨진 필드 하나를 추가 한 후 이제 모든 것이 정상적으로 작동합니다. –