2017-01-09 1 views
0

Просто вернуть некоторые (уценки) строку в колбе:Я не могу достичь URL с колбой вызывающего pandoc (ошибкой ResponseTimeOut)

@app.route("/raw/", methods=['GET']) 
def sometext(): 
    return "This is an **example**" 

## Main procedure 
if __name__ == "__main__": 
    app.run(debug=True, port=8000) 

Если вы звоните pandoc непосредственно (pandoc http://localhost:8000/raw) или с subprocess, вы не получите никаких проблем:

import subprocess, os 

url = "http://localhost:8000/raw" 
pbody = subprocess.run(["pandoc", url], check=True, stdout=subprocess.PIPE) 
print(pbody.stdout.decode()) 

Но если вы звоните pandoc в методе колба:

@app.route("/get", methods=['GET']) 
def index(): 
    url = "{}".format(url_for('sometext', _external=True)) 
    pbody = subprocess.run(["pandoc", url], check=True, stdout=subprocess.PIPE, universal_newlines=True) 
    print("***Error: ", pbody.stderr) 
    return pbody.stdout 

Затем, когда вы получите доступ к http://localhost:8000/get вы получите ошибку Responsetimeout из pandoc:

pandoc: HttpExceptionRequest Request { 
    host     = "localhost" 
    port     = 8000 
    secure    = False 
    requestHeaders  = [] 
    path     = "/raw/" 
    queryString   = "" 
    method    = "GET" 
    proxy    = Nothing 
    rawBody    = False 
    redirectCount  = 10 
    responseTimeout  = ResponseTimeoutDefault 
    requestVersion  = HTTP/1.1 
} 
ResponseTimeout 

Ссылка: url_for in flask API

ответ

2

Как я помню сервер Колба HTTP однопоточный, поэтому он не может справиться с «/» сырого запроса пока он все еще находится в процессе обработки запроса '/ get'.

Answer to another SO question предлагает использовать app.run(threaded=True), что может быть достаточно для личного использования. Для использования в производстве вы должны рассмотреть настоящий веб-сервер, такой как nginx или apache.

Даже тогда, предполагая, что pandoc поддерживает его (я понятия не имею), вы можете рассмотреть вопрос о направлении ввода уценки в pandoc стандартного ввода и избежать дополнительного запроса HTTP вообще, что-то вроде (непроверенные)

markdown = StringIO("This is an **example**") 
pbody = subprocess.run(["pandoc"], check=True, stdin=markdown, stdout=subprocess.PIPE, universal_newlines=True) 
+0

Или создать реальное приложение WSGI. Как [здесь] (http://flask.pocoo.org/docs/0.12/deploying/wsgi-standalone/). – erip

+0

'stringIO' не работает (python3). Используя библиотеку [io] (https://docs.python.org/3/library/io.html#io.StringIO), я получаю 'io.UnsupportedOperation: fileno' с' markdown = io.StringIO ("Это * * пример ** ")'. Кто-нибудь знает, как использовать 'stdin' в подпроцессе в python3? – somenxavier

+0

Он должен работать с stringIO, потому что в bash вы можете называть 'echo 'some text' | pandoc -' работает – somenxavier

Смежные вопросы