0

저는 앱 엔진에 대한 문제가 없으며 간단한 채팅 기능을 보일러 플레이트 (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 %} 

답변

0

이 코드를 보일러 플레이트에 붙여 넣을 때 세션을 처리하는 핸들러를 실수로 잘라 버렸습니다. 이것이 오류를 던지고있는 것입니다.

+0

비슷한 문제가 있습니다 (POST는 goe-boilerplate를 사용하지 않을 때 작동하지만 그렇지 않습니다). gae-b에 통합 할 때 작동). 나는 또 다른 질문을 발견했다. http://stackoverflow.com/questions/13020681/gae-boilerplate-documentation 그는 모든 POST 요청에 csrf_token을 포함시켜야한다고 말했다. 웹에서 세션 제어에 익숙하지 않은데, 내 게시물 요청 처리기에 무엇을 추가해야하는지 알고 있습니까? –

+0

그래, 나는 길을 찾는다. 내 경우에는 gae-b의 basehandler에 함수 디스패치가 _csrf_token이 일치하지 않으면 POST를 차단합니다 ... gae-b의 다른 양식 예제에 대한 참조자가 있으며 내 양식에 숨겨진 필드 하나를 추가 한 후 이제 모든 것이 정상적으로 작동합니다. –

0

RedirectRoute를 검사하여 POST에서 오류를 반환 할 수있는 처리가 있는지 확인 했습니까?

편집

: 내가 GAE-보일러에 잠깐 살펴 보았다, 그것은

routes.add_routes(app) 
boilerplate_routes.add_routes(app) 
admin_routes.add_routes(app) 

마지막 두 가지 기능이 당신의 경로를 망쳐 될 수는 main.py에 추가 코드를 가지고있다. 내가하는 일을 모르는 경우 상용구를 사용하지 않는 것이 좋습니다.

+0

POST와 관련하여 문제가 발생할 수있는 곳을 찾을 수없는 것 같지만 라우팅이 무언가를 엄격하게 처리하는 것으로 생각하고 있다고 생각합니다. Route 만 사용하고 라우팅에서 후행 슬래시를 제거하도록 코드를 변경하면 채팅 메시지를 게시하려고 할 때 "리소스에 대한 액세스가 거부되었습니다"라는 오류가 발생합니다. –

+0

또한 보일러 플레이트의 외부 응용 프로그램과 함께 RedirectRoute를 사용하여 시도했지만 채팅 라우팅에서 "/"후행을 가져 와서 작동했습니다. 그래서 "RedirectRoute"를 사용하여 라우팅을 사용하여 상용구 환경에서이 (슬래시 제거)를 시도했지만 "자원이 액세스가 거부되었습니다"오류가 발생했습니다. –