.add_message() now works inside plugins, closes #864

Refs #870
This commit is contained in:
Simon Willison 2020-06-28 17:25:35 -07:00
commit 7ac4936cec
4 changed files with 32 additions and 17 deletions

View file

@ -5,6 +5,7 @@ import datetime
import hashlib
import inspect
import itertools
from itsdangerous import BadSignature
import json
import os
import re
@ -926,6 +927,14 @@ class DatasetteRouter:
if base_url != "/" and path.startswith(base_url):
path = "/" + path[len(base_url) :]
request = Request(scope, receive)
# Populate request_messages if ds_messages cookie is present
try:
request._messages = self.ds.unsign(
request.cookies.get("ds_messages", ""), "messages"
)
except BadSignature:
pass
scope_modifications = {}
# Apply force_https_urls, if set
if (
@ -952,7 +961,11 @@ class DatasetteRouter:
new_scope = dict(scope, url_route={"kwargs": match.groupdict()})
request.scope = new_scope
try:
return await view(request, send)
response = await view(request, send)
if response:
self.ds._write_messages_to_response(request, response)
await response.asgi_send(send)
return
except NotFound as exception:
return await self.handle_404(scope, receive, send, exception)
except Exception as exception:
@ -1099,6 +1112,6 @@ def wrap_view(view_fn, datasette):
datasette=datasette,
)
if response is not None:
await response.asgi_send(send)
return response
return async_view_fn

View file

@ -1,7 +1,6 @@
import asyncio
import csv
import itertools
from itsdangerous import BadSignature
import json
import re
import time
@ -82,19 +81,8 @@ class BaseView:
return "ff0000"
async def dispatch_request(self, request, *args, **kwargs):
# Populate request_messages if ds_messages cookie is present
if self.ds:
try:
request._messages = self.ds.unsign(
request.cookies.get("ds_messages", ""), "messages"
)
except BadSignature:
pass
handler = getattr(self, request.method.lower(), None)
response = await handler(request, *args, **kwargs)
if self.ds:
self.ds._write_messages_to_response(request, response)
return response
return await handler(request, *args, **kwargs)
async def render(self, templates, request, context=None):
context = context or {}
@ -123,10 +111,9 @@ class BaseView:
def as_view(cls, *class_args, **class_kwargs):
async def view(request, send):
self = view.view_class(*class_args, **class_kwargs)
response = await self.dispatch_request(
return await self.dispatch_request(
request, **request.scope["url_route"]["kwargs"]
)
await response.asgi_send(send)
view.view_class = cls
view.__doc__ = cls.__doc__