Add handler names for websockets for url_for usage (#1880)
This commit is contained in:
parent
761eef7d96
commit
938c49b899
|
@ -283,6 +283,13 @@ class Blueprint:
|
||||||
strict_slashes = self.strict_slashes
|
strict_slashes = self.strict_slashes
|
||||||
|
|
||||||
def decorator(handler):
|
def decorator(handler):
|
||||||
|
nonlocal uri
|
||||||
|
nonlocal host
|
||||||
|
nonlocal strict_slashes
|
||||||
|
nonlocal version
|
||||||
|
nonlocal name
|
||||||
|
|
||||||
|
name = f"{self.name}.{name or handler.__name__}"
|
||||||
route = FutureRoute(
|
route = FutureRoute(
|
||||||
handler, uri, [], host, strict_slashes, False, version, name
|
handler, uri, [], host, strict_slashes, False, version, name
|
||||||
)
|
)
|
||||||
|
|
|
@ -253,7 +253,11 @@ def test_several_bp_with_host(app):
|
||||||
|
|
||||||
|
|
||||||
def test_bp_with_host_list(app):
|
def test_bp_with_host_list(app):
|
||||||
bp = Blueprint("test_bp_host", url_prefix="/test1", host=["example.com", "sub.example.com"])
|
bp = Blueprint(
|
||||||
|
"test_bp_host",
|
||||||
|
url_prefix="/test1",
|
||||||
|
host=["example.com", "sub.example.com"],
|
||||||
|
)
|
||||||
|
|
||||||
@bp.route("/")
|
@bp.route("/")
|
||||||
def handler1(request):
|
def handler1(request):
|
||||||
|
@ -279,8 +283,16 @@ def test_bp_with_host_list(app):
|
||||||
|
|
||||||
|
|
||||||
def test_several_bp_with_host_list(app):
|
def test_several_bp_with_host_list(app):
|
||||||
bp = Blueprint("test_text", url_prefix="/test", host=["example.com", "sub.example.com"])
|
bp = Blueprint(
|
||||||
bp2 = Blueprint("test_text2", url_prefix="/test", host=["sub1.example.com", "sub2.example.com"])
|
"test_text",
|
||||||
|
url_prefix="/test",
|
||||||
|
host=["example.com", "sub.example.com"],
|
||||||
|
)
|
||||||
|
bp2 = Blueprint(
|
||||||
|
"test_text2",
|
||||||
|
url_prefix="/test",
|
||||||
|
host=["sub1.example.com", "sub2.example.com"],
|
||||||
|
)
|
||||||
|
|
||||||
@bp.route("/")
|
@bp.route("/")
|
||||||
def handler(request):
|
def handler(request):
|
||||||
|
|
|
@ -88,10 +88,11 @@ def test_pickle_app_with_bp(app, protocol):
|
||||||
assert up_p_app.is_request_stream is False
|
assert up_p_app.is_request_stream is False
|
||||||
assert response.text == "Hello"
|
assert response.text == "Hello"
|
||||||
|
|
||||||
|
|
||||||
@pytest.mark.parametrize("protocol", [3, 4])
|
@pytest.mark.parametrize("protocol", [3, 4])
|
||||||
def test_pickle_app_with_static(app, protocol):
|
def test_pickle_app_with_static(app, protocol):
|
||||||
app.route("/")(handler)
|
app.route("/")(handler)
|
||||||
app.static('/static', "/tmp/static")
|
app.static("/static", "/tmp/static")
|
||||||
p_app = pickle.dumps(app, protocol=protocol)
|
p_app = pickle.dumps(app, protocol=protocol)
|
||||||
del app
|
del app
|
||||||
up_p_app = pickle.loads(p_app)
|
up_p_app = pickle.loads(p_app)
|
||||||
|
|
|
@ -1,8 +1,8 @@
|
||||||
import os
|
import os
|
||||||
import secrets
|
import secrets
|
||||||
import sys
|
import sys
|
||||||
from contextlib import suppress
|
|
||||||
|
|
||||||
|
from contextlib import suppress
|
||||||
from subprocess import PIPE, Popen, TimeoutExpired
|
from subprocess import PIPE, Popen, TimeoutExpired
|
||||||
from tempfile import TemporaryDirectory
|
from tempfile import TemporaryDirectory
|
||||||
from textwrap import dedent
|
from textwrap import dedent
|
||||||
|
@ -23,16 +23,20 @@ try:
|
||||||
except ImportError:
|
except ImportError:
|
||||||
flags = 0
|
flags = 0
|
||||||
|
|
||||||
|
|
||||||
def terminate(proc):
|
def terminate(proc):
|
||||||
if flags:
|
if flags:
|
||||||
proc.send_signal(CTRL_BREAK_EVENT)
|
proc.send_signal(CTRL_BREAK_EVENT)
|
||||||
else:
|
else:
|
||||||
proc.terminate()
|
proc.terminate()
|
||||||
|
|
||||||
|
|
||||||
def write_app(filename, **runargs):
|
def write_app(filename, **runargs):
|
||||||
text = secrets.token_urlsafe()
|
text = secrets.token_urlsafe()
|
||||||
with open(filename, "w") as f:
|
with open(filename, "w") as f:
|
||||||
f.write(dedent(f"""\
|
f.write(
|
||||||
|
dedent(
|
||||||
|
f"""\
|
||||||
import os
|
import os
|
||||||
from sanic import Sanic
|
from sanic import Sanic
|
||||||
|
|
||||||
|
@ -45,9 +49,11 @@ def write_app(filename, **runargs):
|
||||||
if __name__ == "__main__":
|
if __name__ == "__main__":
|
||||||
app.run(**{runargs!r})
|
app.run(**{runargs!r})
|
||||||
"""
|
"""
|
||||||
))
|
)
|
||||||
|
)
|
||||||
return text
|
return text
|
||||||
|
|
||||||
|
|
||||||
def scanner(proc):
|
def scanner(proc):
|
||||||
for line in proc.stdout:
|
for line in proc.stdout:
|
||||||
line = line.decode().strip()
|
line = line.decode().strip()
|
||||||
|
@ -59,14 +65,26 @@ def scanner(proc):
|
||||||
argv = dict(
|
argv = dict(
|
||||||
script=[sys.executable, "reloader.py"],
|
script=[sys.executable, "reloader.py"],
|
||||||
module=[sys.executable, "-m", "reloader"],
|
module=[sys.executable, "-m", "reloader"],
|
||||||
sanic=[sys.executable, "-m", "sanic", "--port", "42104", "--debug", "reloader.app"],
|
sanic=[
|
||||||
|
sys.executable,
|
||||||
|
"-m",
|
||||||
|
"sanic",
|
||||||
|
"--port",
|
||||||
|
"42104",
|
||||||
|
"--debug",
|
||||||
|
"reloader.app",
|
||||||
|
],
|
||||||
)
|
)
|
||||||
|
|
||||||
@pytest.mark.parametrize("runargs, mode", [
|
|
||||||
(dict(port=42102, auto_reload=True), "script"),
|
@pytest.mark.parametrize(
|
||||||
(dict(port=42103, debug=True), "module"),
|
"runargs, mode",
|
||||||
(dict(), "sanic"),
|
[
|
||||||
])
|
(dict(port=42102, auto_reload=True), "script"),
|
||||||
|
(dict(port=42103, debug=True), "module"),
|
||||||
|
(dict(), "sanic"),
|
||||||
|
],
|
||||||
|
)
|
||||||
async def test_reloader_live(runargs, mode):
|
async def test_reloader_live(runargs, mode):
|
||||||
with TemporaryDirectory() as tmpdir:
|
with TemporaryDirectory() as tmpdir:
|
||||||
filename = os.path.join(tmpdir, "reloader.py")
|
filename = os.path.join(tmpdir, "reloader.py")
|
||||||
|
|
|
@ -614,7 +614,7 @@ def test_response_body_bytes_deprecated(app):
|
||||||
with warnings.catch_warnings(record=True) as w:
|
with warnings.catch_warnings(record=True) as w:
|
||||||
warnings.simplefilter("always")
|
warnings.simplefilter("always")
|
||||||
|
|
||||||
HTTPResponse(body_bytes=b'bytes')
|
HTTPResponse(body_bytes=b"bytes")
|
||||||
|
|
||||||
assert len(w) == 1
|
assert len(w) == 1
|
||||||
assert issubclass(w[0].category, DeprecationWarning)
|
assert issubclass(w[0].category, DeprecationWarning)
|
||||||
|
|
|
@ -1,3 +1,8 @@
|
||||||
|
import asyncio
|
||||||
|
|
||||||
|
from sanic.blueprints import Blueprint
|
||||||
|
|
||||||
|
|
||||||
def test_routes_with_host(app):
|
def test_routes_with_host(app):
|
||||||
@app.route("/")
|
@app.route("/")
|
||||||
@app.route("/", name="hostindex", host="example.com")
|
@app.route("/", name="hostindex", host="example.com")
|
||||||
|
@ -13,3 +18,46 @@ def test_routes_with_host(app):
|
||||||
app.url_for("hostpath", _external=True)
|
app.url_for("hostpath", _external=True)
|
||||||
== "http://path.example.com/path"
|
== "http://path.example.com/path"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
def test_websocket_bp_route_name(app):
|
||||||
|
"""Tests that blueprint websocket route is named."""
|
||||||
|
event = asyncio.Event()
|
||||||
|
bp = Blueprint("test_bp", url_prefix="/bp")
|
||||||
|
|
||||||
|
@bp.get("/main")
|
||||||
|
async def main(request):
|
||||||
|
...
|
||||||
|
|
||||||
|
@bp.websocket("/route")
|
||||||
|
async def test_route(request, ws):
|
||||||
|
event.set()
|
||||||
|
|
||||||
|
@bp.websocket("/route2")
|
||||||
|
async def test_route2(request, ws):
|
||||||
|
event.set()
|
||||||
|
|
||||||
|
@bp.websocket("/route3", name="foobar_3")
|
||||||
|
async def test_route3(request, ws):
|
||||||
|
event.set()
|
||||||
|
|
||||||
|
app.blueprint(bp)
|
||||||
|
|
||||||
|
uri = app.url_for("test_bp.main")
|
||||||
|
assert uri == "/bp/main"
|
||||||
|
|
||||||
|
uri = app.url_for("test_bp.test_route")
|
||||||
|
assert uri == "/bp/route"
|
||||||
|
request, response = app.test_client.websocket(uri)
|
||||||
|
assert response.opened is True
|
||||||
|
assert event.is_set()
|
||||||
|
|
||||||
|
event.clear()
|
||||||
|
uri = app.url_for("test_bp.test_route2")
|
||||||
|
assert uri == "/bp/route2"
|
||||||
|
request, response = app.test_client.websocket(uri)
|
||||||
|
assert response.opened is True
|
||||||
|
assert event.is_set()
|
||||||
|
|
||||||
|
uri = app.url_for("test_bp.foobar_3")
|
||||||
|
assert uri == "/bp/route3"
|
||||||
|
|
Loading…
Reference in New Issue
Block a user