Отправка аргумента через URL с помощью API Werkzeug - PullRequest
0 голосов
/ 19 декабря 2018

Я новичок в Werkzeug и начну с простого случая: URL-адрес, где будет указано имя и «Hello» name »,

Я нахожусь на macOS 10.14, установил всеЗапрошены библиотеки Python.

Сценарий Python

from werkzeug.wrappers import Request, Response

@Request.application
def application(environ, start_response):
    request = Request(environ)
    text = 'Hello %s!' % request.args.get('name', 'World')
    response = Response(text, mimetype='text/plain')
    return response(environ, start_response)

if __name__ == '__main__':
    from werkzeug.serving import run_simple
    run_simple('localhost', 4000, application)

и проходит через

python shortly_3.py


 * Running on http://localhost:4000/ (Press CTRL+C to quit)
127.0.0.1 - - [19/Dec/2018 11:45:53] "GET / HTTP/1.1" 500 -

URL-адрес должен быть примерно таким:

 http://localhost:4000/

плюс параметр имени

Я пытался

 http://localhost:4000?name=toto

, но получаю ошибку

Error on request:
TypeError: application() takes exactly 2 arguments (1 given)

Способ передачи аргументов в приложение кажется нормальным, и run_simpleКоманда не показывает дополнительные способы передачи аргументов.

Как я могу передать аргумент имени через URL?

Если я заменим этот вызов

  text = 'Hello %s!' % request.args.get('name')

на этот

  text = 'Hello %s!' % request.args.get('name', 'World')

Следующая загрузка по-прежнему не выполняется с той же ошибкой

http://localhost:4000?name=toto

1 Ответ

0 голосов
/ 19 декабря 2018

вот полный скрипт, с которым я наконец-то пришел (Спасибо Томалаку за указание мне на функцию create_app ())

import os
import redis
import urlparse
from werkzeug.wrappers import Request, Response
from werkzeug.routing import Map, Rule
from werkzeug.exceptions import HTTPException, NotFound
from werkzeug.wsgi import SharedDataMiddleware
from werkzeug.utils import redirect
from jinja2 import Environment, FileSystemLoader

class Shortly(object):

    def __init__(self, config):
        self.redis = redis.Redis(config['redis_host'], config['redis_port'])

    def dispatch_request(self, environ, request):
        request = Request(environ)
        text = 'Hello %s!' % request.args.get('name')
        response = Response(text, mimetype='text/plain')
        return response

    def wsgi_app(self, environ, start_response):
        request = Request(environ)
        response = self.dispatch_request(environ,request)
        return response(environ, start_response)

    def __call__(self, environ, start_response):
        return self.wsgi_app(environ, start_response)


def create_app(redis_host='localhost', redis_port=6379, with_static=True):
    app = Shortly({
        'redis_host':       redis_host,
        'redis_port':       redis_port
    })
    if with_static:
        app.wsgi_app = SharedDataMiddleware(app.wsgi_app, {
            '/static':  os.path.join(os.path.dirname(__file__), 'static')
        })
    return app

if __name__ == '__main__':
    from werkzeug.serving import run_simple
    app = create_app()
    run_simple('127.0.0.1', 5000, app, use_debugger=True, use_reloader=True)

В браузере с

http://127.0.0.1:5000/?name=toto

дает

Hello toto

по желанию

...