|
43 | 43 | "outputs": [], |
44 | 44 | "source": [ |
45 | 45 | "#| export\n", |
46 | | - "import json,uuid,inspect,types,signal,asyncio,threading,inspect,random,contextlib\n", |
| 46 | + "import json,uuid,inspect,types,signal,asyncio,threading,inspect,random,contextlib,httpx,itsdangerous\n", |
47 | 47 | "\n", |
48 | 48 | "from fastcore.utils import *\n", |
49 | 49 | "from fastcore.xml import *\n", |
|
61 | 61 | "from copy import copy,deepcopy\n", |
62 | 62 | "from warnings import warn\n", |
63 | 63 | "from dateutil import parser as dtparse\n", |
64 | | - "from httpx import ASGITransport, AsyncClient\n", |
65 | 64 | "from anyio import from_thread\n", |
66 | 65 | "from uuid import uuid4, UUID\n", |
67 | 66 | "from base64 import b85encode,b64encode\n", |
|
1692 | 1691 | " same_site='lax', sess_https_only=False, sess_domain=None, key_fname='.sesskey',\n", |
1693 | 1692 | " body_wrap=noop_body, htmlkw=None, nb_hdrs=False, canonical=True, **bodykw):\n", |
1694 | 1693 | " middleware,before,after = map(_list, (middleware,before,after))\n", |
1695 | | - " self.title,self.canonical = title,canonical\n", |
| 1694 | + " self.title,self.canonical,self.session_cookie,self.key_fname = title,canonical,session_cookie,key_fname\n", |
1696 | 1695 | " hdrs,ftrs,exts = map(listify, (hdrs,ftrs,exts))\n", |
1697 | 1696 | " exts = {k:htmx_exts[k] for k in exts}\n", |
1698 | 1697 | " htmlkw = htmlkw or {}\n", |
|
1706 | 1705 | " on_startup,on_shutdown = listify(on_startup) or None,listify(on_shutdown) or None\n", |
1707 | 1706 | " self.lifespan,self.hdrs,self.ftrs = lifespan,hdrs,ftrs\n", |
1708 | 1707 | " self.body_wrap,self.before,self.after,self.htmlkw,self.bodykw = body_wrap,before,after,htmlkw,bodykw\n", |
1709 | | - " secret_key = get_key(secret_key, key_fname)\n", |
| 1708 | + " self.secret_key = get_key(secret_key, key_fname)\n", |
1710 | 1709 | " if sess_cls:\n", |
1711 | | - " sess = Middleware(sess_cls, secret_key=secret_key,session_cookie=session_cookie,\n", |
| 1710 | + " sess = Middleware(sess_cls, secret_key=self.secret_key,session_cookie=session_cookie,\n", |
1712 | 1711 | " max_age=max_age, path=sess_path, same_site=same_site,\n", |
1713 | 1712 | " https_only=sess_https_only, domain=sess_domain)\n", |
1714 | 1713 | " middleware.append(sess)\n", |
|
2032 | 2031 | "class Client:\n", |
2033 | 2032 | " \"A simple httpx ASGI client that doesn't require `async`\"\n", |
2034 | 2033 | " def __init__(self, app, url=\"http://testserver\"):\n", |
2035 | | - " self.cli = AsyncClient(transport=ASGITransport(app), base_url=url)\n", |
| 2034 | + " self.cli = httpx.AsyncClient(transport=httpx.ASGITransport(app), base_url=url)\n", |
2036 | 2035 | "\n", |
2037 | 2036 | " def _sync(self, method, url, **kwargs):\n", |
2038 | 2037 | " async def _request(): return await self.cli.request(method, url, **kwargs)\n", |
|
3963 | 3962 | " return dict(workspace=dict(root=path, uuid=uuid))" |
3964 | 3963 | ] |
3965 | 3964 | }, |
| 3965 | + { |
| 3966 | + "cell_type": "code", |
| 3967 | + "execution_count": null, |
| 3968 | + "id": "e27908c0", |
| 3969 | + "metadata": {}, |
| 3970 | + "outputs": [], |
| 3971 | + "source": [ |
| 3972 | + "#| export\n", |
| 3973 | + "@patch\n", |
| 3974 | + "def get_client(self:FastHTML, asink=False, **kw):\n", |
| 3975 | + " \"Get an httpx client with session cookes set from `**kw`\"\n", |
| 3976 | + " signer = itsdangerous.TimestampSigner(self.secret_key)\n", |
| 3977 | + " data = b64encode(dumps(kw).encode())\n", |
| 3978 | + " data = signer.sign(data)\n", |
| 3979 | + " client = httpx.AsyncClient() if asink else httpx.Client()\n", |
| 3980 | + " client.cookies.update({self.session_cookie: data.decode()})\n", |
| 3981 | + " return client" |
| 3982 | + ] |
| 3983 | + }, |
3966 | 3984 | { |
3967 | 3985 | "cell_type": "markdown", |
3968 | 3986 | "id": "474e14b4", |
|
3978 | 3996 | "metadata": {}, |
3979 | 3997 | "outputs": [], |
3980 | 3998 | "source": [ |
3981 | | - "#|hide\n", |
| 3999 | + "#| hide\n", |
3982 | 4000 | "import nbdev; nbdev.nbdev_export()" |
3983 | 4001 | ] |
3984 | 4002 | }, |
|
0 commit comments