{"id":13424755,"url":"https://github.com/BeeMyDesk/prerender-python-starlette","last_synced_at":"2025-03-15T18:35:52.110Z","repository":{"id":57454616,"uuid":"245627127","full_name":"BeeMyDesk/prerender-python-starlette","owner":"BeeMyDesk","description":"Starlette middleware for Prerender","archived":true,"fork":false,"pushed_at":"2020-07-21T05:07:57.000Z","size":641,"stargazers_count":15,"open_issues_count":10,"forks_count":0,"subscribers_count":2,"default_branch":"master","last_synced_at":"2024-04-11T11:32:31.172Z","etag":null,"topics":["asgi","fastapi","prerender","ssr","starlette","starlette-middleware"],"latest_commit_sha":null,"homepage":null,"language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/BeeMyDesk.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2020-03-07T12:16:34.000Z","updated_at":"2023-02-10T18:52:56.000Z","dependencies_parsed_at":"2022-09-04T18:22:23.399Z","dependency_job_id":null,"html_url":"https://github.com/BeeMyDesk/prerender-python-starlette","commit_stats":null,"previous_names":[],"tags_count":2,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/BeeMyDesk%2Fprerender-python-starlette","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/BeeMyDesk%2Fprerender-python-starlette/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/BeeMyDesk%2Fprerender-python-starlette/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/BeeMyDesk%2Fprerender-python-starlette/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/BeeMyDesk","download_url":"https://codeload.github.com/BeeMyDesk/prerender-python-starlette/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":243775922,"owners_count":20346287,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["asgi","fastapi","prerender","ssr","starlette","starlette-middleware"],"created_at":"2024-07-31T00:00:58.810Z","updated_at":"2025-03-15T18:35:47.089Z","avatar_url":"https://github.com/BeeMyDesk.png","language":"Python","readme":"# Prerender Python Starlette\n\n\u003cp align=\"center\"\u003e\n    \u003cem\u003eStarlette middleware for Prerender\u003c/em\u003e\n\u003c/p\u003e\n\n[![build](https://github.com/BeeMyDesk/prerender-python-starlette/workflows/Build/badge.svg)](https://github.com/BeeMyDesk/prerender-python-starlette/actions)\n[![codecov](https://codecov.io/gh/BeeMyDesk/prerender-python-starlette/branch/master/graph/badge.svg)](https://codecov.io/gh/BeeMyDesk/prerender-python-starlette)\n[![Dependabot Status](https://api.dependabot.com/badges/status?host=github\u0026repo=BeeMyDesk/prerender-python-starlette)](https://dependabot.com)\n[![PyPI version](https://badge.fury.io/py/prerender-python-starlette.svg)](https://badge.fury.io/py/prerender-python-starlette)\n\n---\n\n**Documentation**: \u003ca href=\"https://BeeMyDesk.github.io/prerender-python-starlette/\" target=\"_blank\"\u003ehttps://BeeMyDesk.github.io/prerender-python-starlette/\u003c/a\u003e\n\n**Source Code**: \u003ca href=\"https://github.com/BeeMyDesk/prerender-python-starlette\" target=\"_blank\"\u003ehttps://github.com/BeeMyDesk/prerender-python-starlette\u003c/a\u003e\n\n---\n\n## Introduction\n\n\u003e Google, Facebook, Twitter, and Bing are constantly trying to view your website... but Google is the only crawler that executes a meaningful amount of JavaScript and Google even admits that they can execute JavaScript weeks after actually crawling. Prerender allows you to serve the full HTML of your website back to Google and other crawlers so that they don't have to execute any JavaScript. [Google recommends using Prerender.io](https://developers.google.com/search/docs/guides/dynamic-rendering) to prevent indexation issues on sites with large amounts of JavaScript.\n\u003e\n\u003e Prerender is perfect for Angular SEO, React SEO, Vue SEO, and any other JavaScript framework.\n\u003e\n\u003e This middleware intercepts requests to your Node.js website from crawlers, and then makes a call to the (external) Prerender Service to get the static HTML instead of the JavaScript for that page. That HTML is then returned to the crawler.\n\n*README of [prerender_rails](https://github.com/prerender/prerender_rails)*\n\nThis library is a Python implementation of a Prerender middleware for [Starlette](https://www.starlette.io). It should work flawlessly with [FastAPI](https://fastapi.tiangolo.com/) and, probably, with any ASGI framework.\n\n## Installation\n\n```bash\npip install prerender-python-starlette\n```\n\n## Usage\n\n```py\nfrom starlette.applications import Starlette\nfrom starlette.middleware import Middleware\nfrom prerender_python_starlette import PrerenderMiddleware\n\nroutes = ...\n\nmiddleware = [\n  Middleware(PrerenderMiddleware),\n]\n\napp = Starlette(routes=routes, middleware=middleware)\n```\n\n### Parameters\n\n* `prerender_service_url`: URL of Prerender server. Defaults to `PRERENDER_SERVICE_URL` environment variable.\n* `prerender_service_username`: HTTP basic auth username of Prerender server. Defaults to `PRERENDER_SERVICE_USERNAME` environment variable.\n* `prerender_service_password`: HTTP basic auth password of Prerender server. Defaults to `PRERENDER_SERVICE_PASSWORD` environment variable.\n* `prerender_service_token`: Token set in `X-Prerender-Token` header. Defaults to `PRERENDER_SERVICE_TOKEN` environment variable.\n* `crawler_user_agents`: List of crawler user agents to intercept. Defaults to `DEFAULT_CRAWLER_USER_AGENTS` list.\n* `extensions_to_ignore`: List of file extensions to ignore. Defaults to `DEFAULT_EXTENSIONS_TO_IGNORE` list.\n* `whitelist`: List of path patterns to whitelist. Path not matching a pattern in the list won't be prerendered. Defaults to `None`.\n* `blacklist`: List of path patterns to blacklist. Path matching a pattern in the list won't be prerendered. Defaults to `None`.\n* `before_render`: Async function called before the prerendering. If it returns an `HTMLResponse`, it will be considered as cache and will bypass the call to the Prerender server. Defaults to `None`.\n* `after_render`: Async function called after the prerendering. Defaults to `None`.\n\n### Cache example\n\n```py\nfrom starlette.applications import Starlette\nfrom starlette.middleware import Middleware\nfrom prerender_python_starlette import PrerenderMiddleware\n\n\nasync def before_render(request: Request) -\u003e Optional[HTMLResponse]:\n    cached_response = await cache.get(f\"prerender:{request.url.path}\")\n    if cached_response:\n        return HTMLResponse(cached_response)\n    return None\n\n\nasync def after_render(\n    request: Request, response: HTMLResponse, cached: bool\n) -\u003e None:\n    if not cached:\n        await cache.set(\n            f\"prerender:{request.url.path}\", response.body.decode(response.charset)\n        )\n\n\nroutes = ...\n\nmiddleware = [\n  Middleware(PrerenderMiddleware, before_render=before_render, after_render=after_render),\n]\n\napp = Starlette(routes=routes, middleware=middleware)\n```\n\n## Development\n\n### Setup environement\n\nYou should have [Pipenv](https://pipenv.readthedocs.io/en/latest/) installed. Then, you can install the dependencies with:\n\n```bash\npipenv install --dev\n```\n\nAfter that, activate the virtual environment:\n\n```bash\npipenv shell\n```\n\n### Run unit tests\n\nYou can run all the tests with:\n\n```bash\nmake test\n```\n\nAlternatively, you can run `pytest` yourself:\n\n```bash\npytest\n```\n\n### Format the code\n\nExecute the following command to apply `isort` and `black` formatting:\n\n```bash\nmake format\n```\n\n## License\n\nThis project is licensed under the terms of the MIT license.\n","funding_links":[],"categories":["Third-Party Extensions"],"sub_categories":["Utils"],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2FBeeMyDesk%2Fprerender-python-starlette","html_url":"https://awesome.ecosyste.ms/projects/github.com%2FBeeMyDesk%2Fprerender-python-starlette","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2FBeeMyDesk%2Fprerender-python-starlette/lists"}