Comments (4)
Thinking about this a bit more, what may be most important, at least for my understanding, is determining a potential view pattern. From what I can gather looking at the CORS extensions for other projects (including both WSGI and asyncio) is that they generally assume some application-level configuration but also that a wrapped application will return a mutable response.
I can potentially see how to implement generic CORS behavior for Starlette in a similar way if I base it around something like the pattern proposed in #35, but I haven't thought of an alternative as of yet.
from starlette.
Following up on the last comment, I've realized that theasgi_application
method may be all that is necessary for implementing this behavior. I'm going to close this in favor of using the views issue for any further discussion on this #27 since it seems mostly related to that rather than CORS support specifically.
from starlette.
but enabling CORS support would require altering the response class headers which cannot be accomplished simply by wrapping the ASGI app at this point.
Right - response middleware is more awkward that request middleware, because you need to wrap the send
callable that gets passed to the application. If you do that then you can intercept the outgoing response, and modify the headers.
I'd far prefer that we implement CORS in middleware, than as part of a view pattern.
from starlette.
Here's one kinda pattern that I think would work...
class CORSMiddleware:
def __init__(self, app):
self.app = app
def __call__(self, scope):
return functools.partial(self.handler, scope=scope)
async def handler(self, receive, send, scope=None):
sender = functools.partial(self.sender, send=send)
inner = self.app(scope)
await inner(receive, sender)
async def sender(message, send=None):
if message['type'] == 'http.response':
headers = Headers(message['headers'])
headers['...'] = '...'
await send(message)
from starlette.
Related Issues (20)
- Drop `python-multipart` dependency
- Warn users if setting too large of a session object
- Typing error for app.add_exception_handler (Argument "handler" to "add_exception_handler" of "Starlette" has incompatible type) HOT 1
- TrustedHostMiddleware raises RuntimeError on sending response to websocket HOT 2
- typing map _RequestData in testclient.py might be missing type bytes HOT 2
- Enable `branch = true` for `coverage.run` HOT 4
- Fetching API docs occasionally fails at starlette framework middleware issue with streaming large responses
- links on the release-notes not found. HOT 1
- Add `Partitioned` cookie attribute HOT 2
- `RuntimeError("No response returned")` in `BaseHTTPMiddleware` HOT 11
- Incompatibility with anyio v3
- TestClient DeprecationWarning with httpx 0.27.0 HOT 5
- Bug: `_TemplateResponse` is still relying on `request` key from `context` which maybe different from `request` argument to `TemplateResponse`. HOT 4
- How to change the value of request body?
- A `RuntimeError: Stream consumed` error is raised when `request.body()` is read in the custom middleware
- CORSMiddleware always add access-control-allow-credentials regardless of Origin
- ValueError when null byte in URL HOT 2
- responses.py - appears UTF incompatible (Line 58 and probably other places)
- Double path unquote inside _TestClientTransport.__init__ method
- [FeatureRequest] Cant configure request.stream() chunk size -- always 128kb per chunk read HOT 1
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
D3
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
-
Recommend Topics
-
javascript
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
-
web
Some thing interesting about web. New door for the world.
-
server
A server is a program made to process requests and deliver data to clients.
-
Machine learning
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from starlette.