![image](https://user-images.githubusercontent.com/6599653/114456558-032e2200-9bab-11eb-88bc-a19897f417ba.png)
# Inertia.js Django Adapter
## Installation
### Backend
Install the following python package via pip
```bash
pip install inertia-django
```
Add the Inertia app to your `INSTALLED_APPS` in `settings.py`
```python
INSTALLED_APPS = [
# django apps,
'inertia',
# your project's apps,
]
```
Add the Inertia middleware to your `MIDDLEWARE` in `settings.py`
```python
MIDDLEWARE = [
# django middleware,
'inertia.middleware.InertiaMiddleware',
# your project's middleware,
]
```
Finally, create a layout which exposes `{% block inertia %}{% endblock %}` in the body and set the path to this layout as `INERTIA_LAYOUT` in your `settings.py` file.
Now you're all set!
### Frontend
Django specific frontend docs coming soon. For now, we recommend installing [django_vite](https://github.com/MrBin99/django-vite)
and following the commits on the Django Vite [example repo](https://github.com/MrBin99/django-vite-example). Once Vite is setup with
your frontend of choice, just replace the contents of `entry.js` with [this file (example in react)](https://github.com/BrandonShar/inertia-rails-template/blob/main/app/frontend/entrypoints/application.jsx)
You can also check out the official Inertia docs at https://inertiajs.com/.
### CSRF
Django's CSRF tokens are tightly coupled with rendering templates so Inertia Django automatically handles adding the CSRF cookie for you to each Inertia response. Because the default names Django users for the CSRF headers don't match Axios (the Javascript request library Inertia uses), we'll need to either modify Axios's defaults OR Django's settings.
**You only need to choose one of the following options, just pick whichever makes the most sense to you!**
In your `entry.js` file
```javascript
axios.defaults.xsrfHeaderName = "X-CSRFToken";
axios.defaults.xsrfCookieName = "csrftoken";
```
OR
In your Django `settings.py` file
```python
CSRF_HEADER_NAME = 'HTTP_X_XSRF_TOKEN'
CSRF_COOKIE_NAME = 'XSRF-TOKEN'
```
## Usage
### Responses
Render Inertia responses is simple, you can either use the provided inertia render function or, for the most common use case, the inertia decorator. The render function accepts four arguments, the first is your request object. The second is the name of the component you want to render from within your pages directory (without extension). The third argument is a dict of `props` that should be provided to your components. The final argument is `template_data`, for any variables you want to provide to your template, but this is much less common.
```python
from inertia import render
from .models import Event
def index(request):
return render(request, 'Event/Index', props={
'events': Event.objects.all()
})
```
Or use the simpler decorator for the most common use cases
```python
from inertia import inertia
from .models import Event
@inertia('Event/Index')
def index(request):
return {
'events': Event.objects.all(),
}
```
If you need more control, you can also directly return the InertiaResponse class. It has the same arguments as the render method and subclasses HttpResponse to accept of all its arguments as well.
```python
from inertia import InertiaResponse
from .models import Event
def index(request):
return InertiaResponse(
request,
'Event/Index',
props={
'events': Event.objects.all()
}
)
```
### Shared Data
If you have data that you want to be provided as a prop to every component (a common use-case is information about the authenticated user) you can use the `share` method. A common place to put this would be in some custom middleware.
```python
from inertia import share
from django.conf import settings
from .models import User
def inertia_share(get_response):
def middleware(request):
share(request,
app_name=settings.APP_NAME,
user_count=lambda: User.objects.count(), # evaluated lazily at render time
user=lambda: request.user, # evaluated lazily at render time
)
return get_response(request)
return middleware
```
### External Redirects
It is possible to redirect to an external website, or even another non-Inertia endpoint in your app while handling an Inertia request.
This can be accomplished using a server-side initiated `window.location` visit via the `location` method:
```python
from inertia import location
def external():
return location("http://foobar.com/")
```
It will generate a `409 Conflict` response and include the destination URL in the `X-Inertia-Location` header.
When this response is received client-side, Inertia will automatically perform a `window.location = url` visit.
### Optional Props
On the front end, Inertia supports the concept of "partial reloads" where only the props requested
are returned by the server. Sometimes, you may want to use this flow to avoid processing a particularly slow prop on the intial load. In this case, you can use `Optional props`. Optional props aren't evaluated unless they're specifically requested by name in a partial reload.
```python
from inertia import optional, inertia
@inertia('ExampleComponent')
def example(request):
return {
'name': lambda: 'Brandon', # this will be rendered on the first load as usual
'data': optional(lambda: some_long_calculation()), # this will only be run when specifically requested by partial props and WILL NOT be included on the initial load
}
```
### Deferred Props
As of version 2.0, Inertia supports the ability to defer the fetching of props until after the page has been initially rendered. Essentially this is similar to the concept of `Optional props` however Inertia provides convenient frontend components to automatically fetch the deferred props after the page has initially loaded, instead of requiring the user to initiate a reload. For more info, see [Deferred props](https://inertiajs.com/deferred-props) in the Inertia documentation.
To mark props as deferred on the server side use the `defer` function.
```python
from inertia import defer, inertia
@inertia('ExampleComponent')
def example(request):
return {
'name': lambda: 'Brandon', # this will be rendered on the first load as usual
'data': defer(lambda: some_long_calculation()), # this will only be run after the frontend has initially loaded and inertia requests this prop
}
```
#### Grouping requests
By default, all deferred props get fetched in one request after the initial page is rendered, but you can choose to fetch data in parallel by grouping props together.
```python
from inertia import defer, inertia
@inertia('ExampleComponent')
def example(request):
return {
'name': lambda: 'Brandon', # this will be rendered on the first load as usual
'data': defer(lambda: some_long_calculation()),
'data1': defer(lambda: some_long_calculation1(), group='group'),
'data2': defer(lambda: some_long_calculation1(), 'group'),
}
```
In the example above, the `data1`, and `data2` props will be fetched in one request, while the `data` prop will be fetched in a separate request in parallel. Group names are arbitrary strings and can be anything you choose.
### Merge Props
By default, Inertia overwrites props with the same name when reloading a page. However, there are instances, such as pagination or infinite scrolling, where that is not the desired behavior. In these cases, you can merge props instead of overwriting them.
```python
from inertia import merge, inertia
@inertia('ExampleComponent')
def example(request):
return {
'name': lambda: 'Brandon',
'data': merge(Paginator(objects, 3)),
}
```
You can also combine deferred props with mergeable props to defer the loading of the prop and ultimately mark it as mergeable once it's loaded.
```python
from inertia import defer, inertia
@inertia('ExampleComponent')
def example(request):
return {
'name': lambda: 'Brandon',
'data': defer(lambda: Paginator(objects, 3), merge=True),
}
```
### Json Encoding
Inertia Django ships with a custom JsonEncoder at `inertia.utils.InertiaJsonEncoder` that extends Django's
`DjangoJSONEncoder` with additional logic to handle encoding models and Querysets. If you have other json
encoding logic you'd prefer, you can set a new JsonEncoder via the settings.
### History Encryption
Inertia.js supports [history encryption](https://inertiajs.com/history-encryption) to protect sensitive data in the browser's history state. This is useful when your pages contain sensitive information that shouldn't be stored in plain text in the browser's history. This feature requires HTTPS since it relies on `window.crypto.subtle` which is only available in secure contexts.
You can enable history encryption globally via the `INERTIA_ENCRYPT_HISTORY` setting in your `settings.py`:
```python
INERTIA_ENCRYPT_HISTORY = True
```
For more granular control, you can enable encryption on specific views:
```python
from inertia import encrypt_history, inertia
@inertia('TestComponent')
def encrypt_history_test(request):
encrypt_history(request)
return {}
# If you have INERTIA_ENCRYPT_HISTORY = True but want to disable encryption for specific views:
@inertia('PublicComponent')
def public_view(request):
encrypt_history(request, False) # Explicitly disable encryption for this view
return {}
```
When users log out, you might want to clear the history to ensure no sensitive data can be accessed. You can do this by extending the logout view:
```python
from inertia import clear_history
from django.contrib.auth import views as auth_views
class LogoutView(auth_views.LogoutView):
def dispatch(self, request, *args, **kwargs):
response = super().dispatch(request, *args, **kwargs)
clear_history(request)
return response
```
### SSR
#### Backend
Enable SSR via the `INERTIA_SSR_URL` and `INERTIA_SSR_ENABLED` settings
#### Frontend
Coming Soon!
## Settings
Inertia Django has a few different settings options that can be set from within your project's `settings.py` file. Some of them have defaults.
The default config is shown below
```python
INERTIA_VERSION = '1.0' # defaults to '1.0'
INERTIA_LAYOUT = 'layout.html' # required and has no default
INERTIA_JSON_ENCODER = CustomJsonEncoder # defaults to inertia.utils.InertiaJsonEncoder
INERTIA_SSR_URL = 'http://localhost:13714' # defaults to http://localhost:13714
INERTIA_SSR_ENABLED = False # defaults to False
INERTIA_ENCRYPT_HISTORY = False # defaults to False
```
## Testing
Inertia Django ships with a custom TestCase to give you some nice helper methods and assertions.
To use it, just make sure your TestCase inherits from `InertiaTestCase`. `InertiaTestCase` inherits from Django's `django.test.TestCase` so it includes transaction support and a client.
```python
from inertia.test import InertiaTestCase
class ExampleTestCase(InertiaTestCase):
def test_show_assertions(self):
self.client.get('/events/')
# check the component
self.assertComponentUsed('Event/Index')
# access the component name
self.assertEqual(self.component(), 'Event/Index')
# props (including shared props)
self.assertHasExactProps({name: 'Brandon', sport: 'hockey'})
self.assertIncludesProps({sport: 'hockey'})
# access props
self.assertEquals(self.props()['name'], 'Brandon')
# template data
self.assertHasExactTemplateData({name: 'Brian', sport: 'basketball'})
self.assertIncludesTemplateData({sport: 'basketball'})
# access template data
self.assertEquals(self.template_data()['name'], 'Brian')
```
The inertia test helper also includes a special `inertia` client that pre-sets the inertia headers
for you to simulate an inertia response. You can access and use it just like the normal client with commands like `self.inertia.get('/events/')`. When using the inertia client, inertia custom assertions **are not** enabled though, so only use it if you want to directly assert against the json response.
## Examples
- [Django Svelte Template](https://github.com/pmdevita/Django-Svelte-Template) - A Django template and example project demonstrating Inertia with Svelte and SSR.
## Thank you
A huge thank you to the community members who have worked on InertiaJS for Django before us. Parts of this repo were particularly inspired by [Andres Vargas](https://github.com/zodman) and [Samuel Girardin](https://github.com/girardinsamuel). Additional thanks to Andres for the Pypi project.
_Maintained and sponsored by the team at [bellaWatt](https://bellawatt.com/)_
[![bellaWatt Logo](https://user-images.githubusercontent.com/6599653/114456832-5607d980-9bab-11eb-99c8-ab39867c384e.png)](https://bellawatt.com/)
Raw data
{
"_id": null,
"home_page": "https://github.com/inertiajs/inertia-django",
"name": "inertia-django",
"maintainer": null,
"docs_url": null,
"requires_python": "<4.0,>=3.8",
"maintainer_email": null,
"keywords": "inertia, inertiajs, django",
"author": "Brandon Shar",
"author_email": "brandon@bellawatt.com",
"download_url": "https://files.pythonhosted.org/packages/7d/e8/17ef8582c8002d6b488bbf98da98e8eb6f277de29eb8ff071d1de102b220/inertia_django-1.1.0.tar.gz",
"platform": null,
"description": "![image](https://user-images.githubusercontent.com/6599653/114456558-032e2200-9bab-11eb-88bc-a19897f417ba.png)\n\n# Inertia.js Django Adapter\n\n## Installation\n\n### Backend\n\nInstall the following python package via pip\n\n```bash\npip install inertia-django\n```\n\nAdd the Inertia app to your `INSTALLED_APPS` in `settings.py`\n\n```python\nINSTALLED_APPS = [\n # django apps,\n 'inertia',\n # your project's apps,\n]\n```\n\nAdd the Inertia middleware to your `MIDDLEWARE` in `settings.py`\n\n```python\nMIDDLEWARE = [\n # django middleware,\n 'inertia.middleware.InertiaMiddleware',\n # your project's middleware,\n]\n```\n\nFinally, create a layout which exposes `{% block inertia %}{% endblock %}` in the body and set the path to this layout as `INERTIA_LAYOUT` in your `settings.py` file.\n\nNow you're all set!\n\n### Frontend\n\nDjango specific frontend docs coming soon. For now, we recommend installing [django_vite](https://github.com/MrBin99/django-vite)\nand following the commits on the Django Vite [example repo](https://github.com/MrBin99/django-vite-example). Once Vite is setup with\nyour frontend of choice, just replace the contents of `entry.js` with [this file (example in react)](https://github.com/BrandonShar/inertia-rails-template/blob/main/app/frontend/entrypoints/application.jsx)\n\nYou can also check out the official Inertia docs at https://inertiajs.com/.\n\n### CSRF\n\nDjango's CSRF tokens are tightly coupled with rendering templates so Inertia Django automatically handles adding the CSRF cookie for you to each Inertia response. Because the default names Django users for the CSRF headers don't match Axios (the Javascript request library Inertia uses), we'll need to either modify Axios's defaults OR Django's settings.\n\n**You only need to choose one of the following options, just pick whichever makes the most sense to you!**\n\nIn your `entry.js` file\n\n```javascript\naxios.defaults.xsrfHeaderName = \"X-CSRFToken\";\naxios.defaults.xsrfCookieName = \"csrftoken\";\n```\n\nOR\n\nIn your Django `settings.py` file\n\n```python\nCSRF_HEADER_NAME = 'HTTP_X_XSRF_TOKEN'\nCSRF_COOKIE_NAME = 'XSRF-TOKEN'\n```\n\n## Usage\n\n### Responses\n\nRender Inertia responses is simple, you can either use the provided inertia render function or, for the most common use case, the inertia decorator. The render function accepts four arguments, the first is your request object. The second is the name of the component you want to render from within your pages directory (without extension). The third argument is a dict of `props` that should be provided to your components. The final argument is `template_data`, for any variables you want to provide to your template, but this is much less common.\n\n```python\nfrom inertia import render\nfrom .models import Event\n\ndef index(request):\n return render(request, 'Event/Index', props={\n 'events': Event.objects.all()\n })\n```\n\nOr use the simpler decorator for the most common use cases\n\n```python\nfrom inertia import inertia\nfrom .models import Event\n\n@inertia('Event/Index')\ndef index(request):\n return {\n 'events': Event.objects.all(),\n }\n```\n\nIf you need more control, you can also directly return the InertiaResponse class. It has the same arguments as the render method and subclasses HttpResponse to accept of all its arguments as well.\n\n```python\nfrom inertia import InertiaResponse\nfrom .models import Event\n\ndef index(request):\n return InertiaResponse(\n request,\n 'Event/Index',\n props={\n 'events': Event.objects.all()\n }\n )\n```\n\n### Shared Data\n\nIf you have data that you want to be provided as a prop to every component (a common use-case is information about the authenticated user) you can use the `share` method. A common place to put this would be in some custom middleware.\n\n```python\nfrom inertia import share\nfrom django.conf import settings\nfrom .models import User\n\ndef inertia_share(get_response):\n def middleware(request):\n share(request,\n app_name=settings.APP_NAME,\n user_count=lambda: User.objects.count(), # evaluated lazily at render time\n user=lambda: request.user, # evaluated lazily at render time\n )\n\n return get_response(request)\n return middleware\n```\n\n### External Redirects\n\nIt is possible to redirect to an external website, or even another non-Inertia endpoint in your app while handling an Inertia request.\nThis can be accomplished using a server-side initiated `window.location` visit via the `location` method:\n\n```python\nfrom inertia import location\n\ndef external():\n return location(\"http://foobar.com/\")\n```\n\nIt will generate a `409 Conflict` response and include the destination URL in the `X-Inertia-Location` header.\nWhen this response is received client-side, Inertia will automatically perform a `window.location = url` visit.\n\n### Optional Props\n\nOn the front end, Inertia supports the concept of \"partial reloads\" where only the props requested\nare returned by the server. Sometimes, you may want to use this flow to avoid processing a particularly slow prop on the intial load. In this case, you can use `Optional props`. Optional props aren't evaluated unless they're specifically requested by name in a partial reload.\n\n```python\nfrom inertia import optional, inertia\n\n@inertia('ExampleComponent')\ndef example(request):\n return {\n 'name': lambda: 'Brandon', # this will be rendered on the first load as usual\n 'data': optional(lambda: some_long_calculation()), # this will only be run when specifically requested by partial props and WILL NOT be included on the initial load\n }\n```\n\n### Deferred Props\n\nAs of version 2.0, Inertia supports the ability to defer the fetching of props until after the page has been initially rendered. Essentially this is similar to the concept of `Optional props` however Inertia provides convenient frontend components to automatically fetch the deferred props after the page has initially loaded, instead of requiring the user to initiate a reload. For more info, see [Deferred props](https://inertiajs.com/deferred-props) in the Inertia documentation.\n\nTo mark props as deferred on the server side use the `defer` function.\n\n```python\nfrom inertia import defer, inertia\n\n@inertia('ExampleComponent')\ndef example(request):\n return {\n 'name': lambda: 'Brandon', # this will be rendered on the first load as usual\n 'data': defer(lambda: some_long_calculation()), # this will only be run after the frontend has initially loaded and inertia requests this prop\n }\n```\n\n#### Grouping requests\n\nBy default, all deferred props get fetched in one request after the initial page is rendered, but you can choose to fetch data in parallel by grouping props together.\n\n```python\nfrom inertia import defer, inertia\n\n@inertia('ExampleComponent')\ndef example(request):\n return {\n 'name': lambda: 'Brandon', # this will be rendered on the first load as usual\n 'data': defer(lambda: some_long_calculation()),\n 'data1': defer(lambda: some_long_calculation1(), group='group'),\n 'data2': defer(lambda: some_long_calculation1(), 'group'),\n }\n```\n\nIn the example above, the `data1`, and `data2` props will be fetched in one request, while the `data` prop will be fetched in a separate request in parallel. Group names are arbitrary strings and can be anything you choose.\n\n### Merge Props\n\nBy default, Inertia overwrites props with the same name when reloading a page. However, there are instances, such as pagination or infinite scrolling, where that is not the desired behavior. In these cases, you can merge props instead of overwriting them.\n\n```python\nfrom inertia import merge, inertia\n\n@inertia('ExampleComponent')\ndef example(request):\n return {\n 'name': lambda: 'Brandon', \n 'data': merge(Paginator(objects, 3)), \n }\n```\n\nYou can also combine deferred props with mergeable props to defer the loading of the prop and ultimately mark it as mergeable once it's loaded.\n\n```python\nfrom inertia import defer, inertia\n\n@inertia('ExampleComponent')\ndef example(request):\n return {\n 'name': lambda: 'Brandon', \n 'data': defer(lambda: Paginator(objects, 3), merge=True), \n }\n```\n\n### Json Encoding\n\nInertia Django ships with a custom JsonEncoder at `inertia.utils.InertiaJsonEncoder` that extends Django's\n`DjangoJSONEncoder` with additional logic to handle encoding models and Querysets. If you have other json\nencoding logic you'd prefer, you can set a new JsonEncoder via the settings.\n\n### History Encryption\n\nInertia.js supports [history encryption](https://inertiajs.com/history-encryption) to protect sensitive data in the browser's history state. This is useful when your pages contain sensitive information that shouldn't be stored in plain text in the browser's history. This feature requires HTTPS since it relies on `window.crypto.subtle` which is only available in secure contexts.\n\nYou can enable history encryption globally via the `INERTIA_ENCRYPT_HISTORY` setting in your `settings.py`:\n\n```python\nINERTIA_ENCRYPT_HISTORY = True\n```\n\nFor more granular control, you can enable encryption on specific views:\n\n```python\nfrom inertia import encrypt_history, inertia\n\n@inertia('TestComponent')\ndef encrypt_history_test(request):\n encrypt_history(request)\n return {}\n\n# If you have INERTIA_ENCRYPT_HISTORY = True but want to disable encryption for specific views:\n@inertia('PublicComponent')\ndef public_view(request):\n encrypt_history(request, False) # Explicitly disable encryption for this view\n return {}\n```\n\nWhen users log out, you might want to clear the history to ensure no sensitive data can be accessed. You can do this by extending the logout view:\n\n```python\nfrom inertia import clear_history\nfrom django.contrib.auth import views as auth_views\n\nclass LogoutView(auth_views.LogoutView):\n def dispatch(self, request, *args, **kwargs):\n response = super().dispatch(request, *args, **kwargs)\n clear_history(request)\n return response\n```\n\n### SSR \n\n#### Backend\n\nEnable SSR via the `INERTIA_SSR_URL` and `INERTIA_SSR_ENABLED` settings\n\n#### Frontend\n\nComing Soon!\n\n## Settings\n\nInertia Django has a few different settings options that can be set from within your project's `settings.py` file. Some of them have defaults.\n\nThe default config is shown below\n\n```python\nINERTIA_VERSION = '1.0' # defaults to '1.0'\nINERTIA_LAYOUT = 'layout.html' # required and has no default\nINERTIA_JSON_ENCODER = CustomJsonEncoder # defaults to inertia.utils.InertiaJsonEncoder\nINERTIA_SSR_URL = 'http://localhost:13714' # defaults to http://localhost:13714\nINERTIA_SSR_ENABLED = False # defaults to False\nINERTIA_ENCRYPT_HISTORY = False # defaults to False\n```\n\n## Testing\n\nInertia Django ships with a custom TestCase to give you some nice helper methods and assertions.\nTo use it, just make sure your TestCase inherits from `InertiaTestCase`. `InertiaTestCase` inherits from Django's `django.test.TestCase` so it includes transaction support and a client.\n\n```python\nfrom inertia.test import InertiaTestCase\n\nclass ExampleTestCase(InertiaTestCase):\n def test_show_assertions(self):\n self.client.get('/events/')\n\n # check the component\n self.assertComponentUsed('Event/Index')\n\n # access the component name\n self.assertEqual(self.component(), 'Event/Index')\n\n # props (including shared props)\n self.assertHasExactProps({name: 'Brandon', sport: 'hockey'})\n self.assertIncludesProps({sport: 'hockey'})\n\n # access props\n self.assertEquals(self.props()['name'], 'Brandon')\n\n # template data\n self.assertHasExactTemplateData({name: 'Brian', sport: 'basketball'})\n self.assertIncludesTemplateData({sport: 'basketball'})\n\n # access template data\n self.assertEquals(self.template_data()['name'], 'Brian')\n```\n\nThe inertia test helper also includes a special `inertia` client that pre-sets the inertia headers\nfor you to simulate an inertia response. You can access and use it just like the normal client with commands like `self.inertia.get('/events/')`. When using the inertia client, inertia custom assertions **are not** enabled though, so only use it if you want to directly assert against the json response.\n\n## Examples\n\n- [Django Svelte Template](https://github.com/pmdevita/Django-Svelte-Template) - A Django template and example project demonstrating Inertia with Svelte and SSR.\n\n## Thank you\n\nA huge thank you to the community members who have worked on InertiaJS for Django before us. Parts of this repo were particularly inspired by [Andres Vargas](https://github.com/zodman) and [Samuel Girardin](https://github.com/girardinsamuel). Additional thanks to Andres for the Pypi project.\n\n_Maintained and sponsored by the team at [bellaWatt](https://bellawatt.com/)_\n\n[![bellaWatt Logo](https://user-images.githubusercontent.com/6599653/114456832-5607d980-9bab-11eb-99c8-ab39867c384e.png)](https://bellawatt.com/)\n",
"bugtrack_url": null,
"license": "MIT",
"summary": "Django adapter for the InertiaJS framework",
"version": "1.1.0",
"project_urls": {
"Homepage": "https://github.com/inertiajs/inertia-django",
"Repository": "https://github.com/inertiajs/inertia-django"
},
"split_keywords": [
"inertia",
" inertiajs",
" django"
],
"urls": [
{
"comment_text": "",
"digests": {
"blake2b_256": "c456addae3df7b5bc94bf734789d9c762b875207bae182782c5850ecc417a229",
"md5": "d6fd34ca79d0a9c38cc960dd905fdaa0",
"sha256": "45cf73483cd4e378474faf47ee6af5c900859dab04bc22704000c64333f76a9f"
},
"downloads": -1,
"filename": "inertia_django-1.1.0-py3-none-any.whl",
"has_sig": false,
"md5_digest": "d6fd34ca79d0a9c38cc960dd905fdaa0",
"packagetype": "bdist_wheel",
"python_version": "py3",
"requires_python": "<4.0,>=3.8",
"size": 21974,
"upload_time": "2025-01-08T15:07:39",
"upload_time_iso_8601": "2025-01-08T15:07:39.129082Z",
"url": "https://files.pythonhosted.org/packages/c4/56/addae3df7b5bc94bf734789d9c762b875207bae182782c5850ecc417a229/inertia_django-1.1.0-py3-none-any.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "7de817ef8582c8002d6b488bbf98da98e8eb6f277de29eb8ff071d1de102b220",
"md5": "7ce408931dbf442d6faae9be109571f6",
"sha256": "c2cffacbc24648610fb4c6a7644eeb3bc1bc450893ad8e253254ce925a9f0a17"
},
"downloads": -1,
"filename": "inertia_django-1.1.0.tar.gz",
"has_sig": false,
"md5_digest": "7ce408931dbf442d6faae9be109571f6",
"packagetype": "sdist",
"python_version": "source",
"requires_python": "<4.0,>=3.8",
"size": 19770,
"upload_time": "2025-01-08T15:07:40",
"upload_time_iso_8601": "2025-01-08T15:07:40.385431Z",
"url": "https://files.pythonhosted.org/packages/7d/e8/17ef8582c8002d6b488bbf98da98e8eb6f277de29eb8ff071d1de102b220/inertia_django-1.1.0.tar.gz",
"yanked": false,
"yanked_reason": null
}
],
"upload_time": "2025-01-08 15:07:40",
"github": true,
"gitlab": false,
"bitbucket": false,
"codeberg": false,
"github_user": "inertiajs",
"github_project": "inertia-django",
"travis_ci": false,
"coveralls": false,
"github_actions": true,
"lcname": "inertia-django"
}