0

Использование Flask и BlueMix для развертывания веб-приложения. Имею некоторые проблемы js, которые я не могу понять. Я продолжаю получать ту же ошибку в консоли браузера. Я не знаю никаких js, поэтому любая помощь была бы очень оценена!Python Flask, BlueMix, js - Анонимная функция

jquery-1.11.1.min.js:4 POST http://newfla.mybluemix.net/ 405 (Method Not Allowed) 
send @ jquery-1.11.1.min.js:4 
m.extend.ajax @ jquery-1.11.1.min.js:4 
(anonymous function) @ demo.js:66 
m.event.dispatch @ jquery-1.11.1.min.js:3 
r.handle @ jquery-1.11.1.min.js:3 

Здесь предполагается (анонимная функция)

$.ajax({ 
    type: 'POST', 
    data: { 
    text: $content.val() 
    }, 
    url: '/', 
    dataType: 'json', 
    success: function(response) { 
    $loading.hide(); 

    if (response.error) { 
     showError(response.error); 
    } else { 
     $results.show(); 
     showTraits(response); 
     showTextSummary(response); 
     showVizualization(response); 
    } 

    } 

UPDATE: Я попробовал несколько разные вещи, соответствующие ваши предложения. Вот где я сейчас, какие-то идеи?

consumer_token = 'aaaaaaaaaaaaaaaaaaaaaaaaa' #substitute values from twitter  website 
consumer_secret = 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa' 
access_token = '3473558363-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa' 
access_secret = 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa' 

auth = tweepy.OAuthHandler(consumer_token,consumer_secret) 
auth.set_access_token(access_token,access_secret) 

api = tweepy.API(auth) 

class PersonalityInsightsService: 
"""Wrapper on the Personality Insights service""" 

def __init__(self, vcapServices): 
""" 
Construct an instance. Fetches service parameters from VCAP_SERVICES 
runtime variable for Bluemix, or it defaults to local URLs. 
""" 


self.url = "https://gateway.watsonplatform.net/personality-insights/api" 
self.username = "aaaaaa-vvvv-1111-2222-mmmmmmmm" 
self.password = "password" 

if vcapServices is not None: 
    print("Parsing VCAP_SERVICES") 
    services = json.loads(vcapServices) 
    svcName = "personality_insights" 
    if svcName in services: 
     print("Personality Insights service found!") 
     svc = services[svcName][0]["credentials"] 
     self.url = svc["url"] 
     self.username = svc["username"] 
     self.password = svc["password"] 
    else: 
     print("ERROR: The Personality Insights service was not found") 
def getProfile(self, text): 
    """Returns the profile by doing a POST to /v2/profile with text""" 

    if self.url is None: 
     raise Exception("No Personality Insights service is bound to this app") 
    response = requests.post(self.url + "/v2/profile", 
         auth=(self.username, self.password), 
         headers = {"content-type": "text/plain"}, 
         data=text 
        ) 
    try: 
     return json.loads(response.text) 
    except: 
     raise Exception("Error processing the request, HTTP: %d" % response.status_code) 

class DemoService(object): 
    """ 
    REST service/app. Since we just have 1 GET and 1 POST URLs, 
    there is not even need to look at paths in the request. 
    This class implements the handler API for cherrypy library. 
    """ 

    screen_name = "realDonaldTrump" 
    maxnumtweets= 500 

    saveFile = open("static/public/text/en.txt",'a') 
    saveFile.seek(0) 
    saveFile.truncate() 


    for status in  tweepy.Cursor(api.user_timeline,id=screen_name).items(maxnumtweets): 
    print status.text[0:2] + '\n' 
    saveFile = open("static/public/text/en.txt",'a') 

    textyt = status.text 

    texty = ''.join(i for i in textyt if ord(i)<128) 
    saveFile.write(texty.encode('utf-8')+'\n'+'\n') 
    saveFile.close() 

def __init__(self, service): 
    self.service = service 
    self.defaultContent = None 

    try: 
     contentFile = open("static/public/text/en.txt", "r") 
     self.defaultContent = contentFile.read() 
    except Exception as e: 
     print "ERROR: couldn't read text file: %s" % e 
    finally: 
     contentFile.close() 

def GET(self): 
    return render_template('newin.html', content= self.defaultContent) 




def POST(self, text=None): 
    """ 
    Send 'text' to the Personality Insights API 
    and return the response. 
    """ 
    try: 
     profileJson = self.service.getProfile(text) 
     return json.dumps(profileJson) 
    except Exception as e: 
     print "ERROR: %s" % e 
     return str(e) 


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

@app.route('/getpost', methods=['GET', 'POST']) 
def new(): 
    personalityInsights = PersonalityInsightsService(os.getenv("VCAP_SERVICES")) 
c = DemoService(personalityInsights) 
if request.method == 'GET': 
    return c.GET() 
elif request.method == 'POST': 
    return c.POST() 
+0

похоже, что вы пытаетесь использовать информацию о личности. Взгляните на python-sdk: https://github.com/watson-developer-cloud/python-sdk/blob/master/examples/personality_insights_v2.py –

+0

Спасибо, немецкий! Я думаю, что проблема здесь в том, насколько я незнакома с вишневым. Я пытался преобразовать это в приложение на основе Flask, моя проблема заключается в том, что я не могу понять, как инициировать POST. – Beezley

+0

Взгляните на это флеш-приложение, которое использует текстовое сообщение. Https://github.com/watson-developer-cloud/text-to-speech-python –

ответ

4

Это не проблема с Javascript. Функция просмотра, обслуживающая URL-адрес корня, не настроена на прием POST запросов. Код ответа 405 (метод здесь быть POST в отличие от GET, PUT, DELETE, OPTIONS, HEAD и т.д ...

Я могу воссоздать его с очень простой привет мир приложение Flask

app.py:

from flask import Flask 

app = Flask(__name__) 

@app.route('/') 
def hello_world(): 
    return 'Hello World' 

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

Запуск приложения из командной строки (будет доступен в http://localhost:5000/):

python app.py 

, а затем выкладываете против него с другого терминала (с помощью requests библиотеки):

import requests 

response = requests.post('http://localhost:5000/', data='') 

реакция печати даст:

<Response [405]> 

Обратите внимание на 405 - тот же код ответа вы получили, метод не разрешен. Вам необходимо явно определить какие-либо другие GET методов, которые вы хотите, чтобы ваши взгляды колб использовать обновив app.route декоратора:

@app.route('/', methods=['GET', 'POST']) 
def hello_world(): 
    return 'Hello World' 

Вообще однако, вы хотите реализовать различные функциональные возможности, если клиент делает POST вместо a GET. Вы можете сделать это, глядя на request.method (вам также необходимо импортировать request):

from flask import Flask, request 

app = Flask(__name__) 

@app.route('/', methods=['GET', 'POST']) 
def hello_world(): 
    if request.method == 'GET': 
     return 'You GOT hello world' 
    elif request.method == 'POST': 
     return 'You POSTed hello world' 

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

Если вы хотите узнать больше о различных методах HTTP, они определяются here.

+0

* Мой комментарий слишком длинный, так что любезно посмотрите второй ответ, спасибо . * – Beezley