Python Flask, BlueMix, JS - анонимная функция
Использование Flask и BlueMix для развертывания веб-приложения. У меня есть некоторые проблемы с JS, которые я не могу понять. Я продолжаю получать ту же ошибку в консоли браузера. Я не знаю 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);
}
}
ОБНОВЛЕНИЕ: я попробовал несколько разных вещей, соответствующих вашим предложениям. Вот где я сейчас, есть идеи?
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()
1 ответ
Это не проблема Javascript. Функция просмотра, которая обслуживает корневой URL, не настроена на прием POST
Запросы. Код ответа 405 METHOD NOT ALLOWED
(метод здесь 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
что вы хотите, чтобы ваши представления Flask использовать путем обновления app.route
декоратор:
@app.route('/', methods=['GET', 'POST'])
def hello_world():
return 'Hello World'
Как правило, однако, вы захотите реализовать другую функциональность, если клиент делает POST
вместо 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, они определены здесь.