Как заставить почтовые запросы работать с ngrok? - PullRequest
0 голосов
/ 06 мая 2020

Я использую python для разработки приложения. Я провожу несколько тестов, чтобы увидеть, как это работает.

Сначала я попробовал этот код с Flask

from flask import Flask
app = Flask(__name__)
@app.route("/")
def hello():
    return 'The GET works'

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

И он работал нормально. Затем, поскольку я хочу, чтобы все имели доступ к моему приложению, я использовал для этого ngrok, я просто набрал в консоли:

./ngrok http 5000

И все сработало нормально, я могу получить доступ к URL отовсюду, но для моего приложения , Мне нужно иметь возможность отправлять запросы POST отовсюду. Но всякий раз, когда я пытаюсь сделать такой почтовый запрос,

import requests
r = requests.post('http://10d2b892.ngrok.io/',data={'key':'value'})

r возвращает Response [405], и я не могу ничего опубликовать. Что мне делать, чтобы запросы на публикацию работали?

Ответы [ 3 ]

0 голосов
/ 07 мая 2020

ngrok пересылает любой HTTP-запрос, который вы ему отправляете. Ваша проблема в том, что приложение Flask написано не для обработки почтовых запросов. В этой заметке я предполагаю, что вы новичок в Flask, и порекомендую вам сразу же переключиться на FastAPI:

from fastapi import FastAPI

app = FastAPI()

@app.get('/', status_code=200)
def index():
    return {'message':'Hello, World!'}

@app.post('/', status_code=201)
def index_post():
    return {'message':'Hello, Post!'}

Я считаю, что это облегчит вашу жизнь как в коротком, так и в длинный пробег. Если вы также запустите его с помощью Uvicorn, у вас будет хорошее начало:

from fastapi import FastAPI
import uvicorn

app = FastAPI()

@app.get('/', status_code=200)
def index():
    return {'message':'Hello, World!'}

@app.post('/', status_code=201)
def index_post():
    return {'message':'Hello, Post!'}

if __name__ == "__main__":
    uvicorn.run(
        "views:app", 
        host="localhost", 
        port=5000,
        reload=True    
    )

Go впереди и назовите этот файл views.py.

Создайте свою виртуальную среду (venv ):

python3 -m venv venv

Источник

source venv/bin/activate

Установите модули

pip install uvicorn fastapi

и запустите

python views.py

Теперь вы можете сделать он доступен с помощью ngrok

ngrok http 5000

Когда вы сохраните изменения в views.py, ваш сервер uvicorn перезагрузится автоматически, и вы сможете попробовать свои изменения, не перезагружая ничего.

Надеюсь на это начинает.

0 голосов
/ 17 мая 2020

Вы почти у цели. Аннотация, которую вы используете

@app.route("/")

, создает маршрут по умолчанию с помощью метода GET, но вы пытаетесь POST. Поскольку вы не определили POST, вы получите 405 Method Not Allowed. Чтобы исправить это, просто определите POST, как описано здесь

@app.route('/', methods=['GET', 'POST'])

В качестве дополнительного бонуса вы также можете управлять ngrok в своем Python скрипте, используя pyngrok . Там есть Flask задокументированный пример здесь , но, если это коротко, вы бы просто сделали from pyngrok import ngrok и ngrok.connect(5000). Бум, теперь у вас есть туннель к серверу Flask dev.

0 голосов
/ 06 мая 2020

Как указано в документации , вы должны использовать аннотации:

from flask import request

@app.route('/login', methods=['GET', 'POST'])
def login():
    if request.method == 'POST':
        return do_the_login()
    else:
        return show_the_login_form()
...