2017-01-14 6 views
0

Ich habe gerade meinen ersten Sprung in Flask genommen und versuche, es zu verwenden, um eine API zu erstellen, die GET, POST und DELETE Routen hat, um eine Blacklist von URLs zu verwalten.Flask POST Route reagiert nicht mehr

Nach einer gewissen Zeit gibt mir die POST-Route einen Fehler: "Konnte keine Antwort erhalten." Der komische Teil ist, dass meine GET und DELETE Routen immer noch gut funktionieren. Ich habe versucht, etwas Logging zu machen, aber ich konnte nicht viel bekommen. Ich würde mich über jede Hilfe freuen!

Hier ist meine App:

from flask import Flask, request 
from flask_cors import CORS, cross_origin 
from flask_restful import Resource, Api 
import pickle 

app = Flask(__name__) 
app.config['DEBUG'] = True 
CORS(app) 


@app.route("/get-blacklist") 
def loadblacklist(): 
    blacklist = pickle.load(open("blacklist.p", "rb")) 
    return dumps(blacklist) 


@app.route("/post-blacklist", methods=['POST']) 
def puturl(): 
    # Get and clean URL 
    url = request.form['url'] 
    url = sanitise(url) 

    # Load the pickle 
    blacklist = list(pickle.load(open("blacklist.p", "rb"))) 

    # Check if it's already in there 
    if url not in blacklist: 
     blacklist.append(url) 

    # Save the pickle 
    pickle.dump(blacklist, open("blacklist.p", "wb")) 

    return 'You posted {}'.format(url) 


@app.route("/remove-blacklist", methods=['DELETE']) 
def removeurl(): 
    # Get and clean the URL 
    url = request.form['url'] 
    url = sanitise(url) 

    # Load the pickle 
    blacklist = list(pickle.load(open("blacklist.p", "rb"))) 

    # Remove if its in there 
    if url in blacklist: 
     blacklist.remove(url) 

    # Save the pickle 
    pickle.dump(blacklist, open("blacklist.p", "wb")) 

    return 'You removed {}'.format(url) 


def sanitise(url): 
    # Sanitise 
    url = url.lower() 
    url = url.replace('www.', '') 
    url = url.replace('http://', '') 
    url = url.replace('https://', '') 
    if url[-1] == '/': 
     url = url[:-1] 
    return url 


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

Hier ist meine Config-Datei ist:

import os 

bind = '0.0.0.0:8000' 
workers = 3 
backlog = 2048 
worker_class = "sync" 
debug = False 
proc_name = 'gunicorn.proc' 
pidfile = './gunicorn.pid' 
logfile = './debug.log' 
loglevel = 'debug' 
timeout = 1000 

Und hier ist der Befehl, den ich die Arbeiter starten bin mit:

gunicorn -c app.conf -w3 --certfile=/etc/letsencrypt/live/mtfmu4.tk/cert.pem --keyfile=/etc/letsencrypt/live/mtfmu4.tk/privkey.pem api:app 

Ich kann in meiner POST-Route nichts besonders unterschiedliches sehen, was dazu führen würde - besonders, da es für eine Weile zu funktionieren scheint e.

Ich laufe Python 3 in einem virtualenv, Flask, Gunicorn auf Apache2 und Ubuntu 14.04.

Jede Hilfe wäre willkommen!

+0

Wie veröffentlichen Sie die Daten? d. h. mit curl oder einem anderen Python-Skript? – jprockbelly

+0

Ich bin POST mit einem jQuery Ajax Aufruf tatsächlich. Ich habe das Gefühl, dass ich das Problem gelöst habe, aber ich werde es noch weitere 12 Stunden geben, um zu sehen, ob es wieder abstürzt. Wird meine Lösung unten posten, wenn es funktioniert –

Antwort

0

Ich fand die Lösung war, die with-Anweisung zu verwenden, um meine Pickle-Datei zu öffnen. Scheint zu helfen, was auch immer beim Öffnen/Schließen-Konflikt passiert.