secure


Namesecure JSON
Version 1.0.0 PyPI version JSON
download
home_pageNone
SummaryA lightweight package that adds security headers for Python web frameworks.
upload_time2024-09-27 09:01:35
maintainerNone
docs_urlNone
authorNone
requires_python>=3.10
licenseMIT
keywords security headers web framework http
VCS
bugtrack_url
requirements No requirements were recorded.
Travis-CI No Travis.
coveralls test coverage No coveralls.
            # secure.py

_A simple, yet powerful way to secure your Python web applications across multiple frameworks._

[![PyPI Version](https://img.shields.io/pypi/v/secure.svg)](https://pypi.org/project/secure/)
[![Python Versions](https://img.shields.io/pypi/pyversions/secure.svg)](https://pypi.org/project/secure/)
[![Ruff](https://img.shields.io/endpoint?url=https://raw.githubusercontent.com/astral-sh/ruff/main/assets/badge/v2.json)](https://github.com/astral-sh/ruff)
[![Downloads](https://pepy.tech/badge/secure)](https://pepy.tech/project/secure)
[![License](https://img.shields.io/pypi/l/secure.svg)](https://github.com/TypeError/secure/blob/main/LICENSE)
[![GitHub Stars](https://img.shields.io/github/stars/TypeError/secure.svg)](https://github.com/TypeError/secure/stargazers)

## **Introduction**

In today's web landscape, security is paramount. **secure.py** is a lightweight Python library designed to effortlessly add **security headers** to your web applications, protecting them from common vulnerabilities. Whether you're using **Django**, **Flask**, **FastAPI**, or any other popular framework, `secure.py` provides a unified API to enhance your application's security posture.

---

## **Why Use secure.py?**

- 🔒 **Apply Essential Security Headers**: Implement headers like CSP, HSTS, and more with minimal effort.
- 🛠️ **Consistent API Across Frameworks**: A unified approach for different web frameworks.
- ⚙️ **Customizable with Secure Defaults**: Start secure out-of-the-box and customize as needed.
- 🚀 **Easy Integration**: Compatible with Python's most-used frameworks.
- 🐍 **Modern Pythonic Design**: Leverages Python 3.10+ features for cleaner and more efficient code.

---

## **Supported Frameworks**

**secure.py** supports the following Python web frameworks:

| Framework                                             | Documentation                                                                                    |
| ----------------------------------------------------- | ------------------------------------------------------------------------------------------------ |
| [aiohttp](https://docs.aiohttp.org)                   | [Integration Guide](https://github.com/TypeError/secure/blob/main/docs/frameworks.md#aiohttp)    |
| [Bottle](https://bottlepy.org)                        | [Integration Guide](https://github.com/TypeError/secure/blob/main/docs/frameworks.md#bottle)     |
| [CherryPy](https://cherrypy.dev/)                     | [Integration Guide](https://github.com/TypeError/secure/blob/main/docs/frameworks.md#cherrypy)   |
| [Django](https://www.djangoproject.com)               | [Integration Guide](https://github.com/TypeError/secure/blob/main/docs/frameworks.md#django)     |
| [Falcon](https://falconframework.org)                 | [Integration Guide](https://github.com/TypeError/secure/blob/main/docs/frameworks.md#falcon)     |
| [FastAPI](https://fastapi.tiangolo.com)               | [Integration Guide](https://github.com/TypeError/secure/blob/main/docs/frameworks.md#fastapi)    |
| [Flask](http://flask.pocoo.org)                       | [Integration Guide](https://github.com/TypeError/secure/blob/main/docs/frameworks.md#flask)      |
| [Masonite](https://docs.masoniteproject.com/)         | [Integration Guide](https://github.com/TypeError/secure/blob/main/docs/frameworks.md#masonite)   |
| [Morepath](https://morepath.readthedocs.io)           | [Integration Guide](https://github.com/TypeError/secure/blob/main/docs/frameworks.md#morepath)   |
| [Pyramid](https://trypyramid.com)                     | [Integration Guide](https://github.com/TypeError/secure/blob/main/docs/frameworks.md#pyramid)    |
| [Quart](https://quart.palletsprojects.com/en/latest/) | [Integration Guide](https://github.com/TypeError/secure/blob/main/docs/frameworks.md#quart)      |
| [Responder](https://responder.kennethreitz.org/)      | [Integration Guide](https://github.com/TypeError/secure/blob/main/docs/frameworks.md#responder)  |
| [Sanic](https://sanicframework.org)                   | [Integration Guide](https://github.com/TypeError/secure/blob/main/docs/frameworks.md#sanic)      |
| [Starlette](https://www.starlette.io/)                | [Integration Guide](https://github.com/TypeError/secure/blob/main/docs/frameworks.md#starlette)  |
| [Tornado](https://www.tornadoweb.org/)                | [Integration Guide](https://github.com/TypeError/secure/blob/main/docs/frameworks.md#tornado)    |
| [TurboGears](https://turbogears.org/)                 | [Integration Guide](https://github.com/TypeError/secure/blob/main/docs/frameworks.md#turbogears) |

---

## **Features**

- 🔒 **Secure Headers**: Automatically apply headers like `Strict-Transport-Security`, `X-Frame-Options`, and more.
- 🛠️ **Customizable Policies**: Flexibly build your own security policies using method chaining.
- 🌐 **Framework Integration**: Compatible with various frameworks, ensuring cross-compatibility.
- 🚀 **No External Dependencies**: Lightweight and easy to include in any project.
- 🧩 **Easy to Use**: Integrate security headers in just a few lines of code.
- ⚡ **Asynchronous Support**: Async support for modern frameworks like **FastAPI** and **Starlette**.
- 📝 **Enhanced Type Hinting**: Complete type annotations for better developer experience.
- 📚 **Attribution to Trusted Sources**: Implements recommendations from MDN and OWASP.

---

## **Requirements**

- **Python 3.10** or higher

  This library leverages modern Python features introduced in Python 3.10 and 3.11, such as:

  - **Union Type Operator (`|`)**: Simplifies type annotations.
  - **Structural Pattern Matching (`match` statement)**: Enhances control flow.
  - **Improved Type Hinting and Annotations**: Provides better code clarity and maintenance.
  - **`cached_property`**: Optimize memory usage and performance.

  **Note:** If you're using an older version of Python (3.6 to 3.9), please use version **0.3.0** of this library, which maintains compatibility with those versions.

- **Dependencies**

  This library has no external dependencies outside of the Python Standard Library.

---

## **Installation**

You can install secure.py using pip, pipenv, or poetry:

**pip**:

```bash
pip install secure
```

**Pipenv**:

```bash
pipenv install secure
```

**Poetry**:

```bash
poetry add secure
```

---

## **Getting Started**

Once installed, you can quickly integrate `secure.py` into your project:

### Synchronous Usage

```python
import secure

# Initialize secure headers with default settings
secure_headers = secure.Secure.with_default_headers()

# Apply the headers to your framework response object
secure_headers.set_headers(response)
```

### Asynchronous Usage

For frameworks like **FastAPI** and **Starlette** that support asynchronous operations, use the async method:

```python
import secure

# Initialize secure headers with default settings
secure_headers = secure.Secure.with_default_headers()

# Apply the headers asynchronously to your framework response object
await secure_headers.set_headers_async(response)
```

### **Example Usage**

```python
import secure

# Create a Secure instance with default headers
secure_headers = secure.Secure.with_default_headers()

# Apply default secure headers to a response object
secure_headers.set_headers(response)
```

---

## **Default Secure Headers**

By default, `secure.py` applies the following headers when using `with_default_headers()`:

```http
Cache-Control: no-store
Cross-Origin-Opener-Policy: same-origin
Content-Security-Policy: default-src 'self'; script-src 'self'; style-src 'self'; object-src 'none'
Strict-Transport-Security: max-age=31536000
Permissions-Policy: geolocation=(), microphone=(), camera=()
Referrer-Policy: strict-origin-when-cross-origin
Server:
X-Content-Type-Options: nosniff
```

---

## **Policy Builders**

`secure.py` allows you to customize headers such as **Content-Security-Policy** and **Permissions-Policy** with ease:

### **Content-Security-Policy Example**

```python
import secure

# Build a custom CSP policy
csp = (
    secure.ContentSecurityPolicy()
    .default_src("'self'")
    .script_src("'self'", "cdn.example.com")
    .style_src("'unsafe-inline'")
    .img_src("'self'", "images.example.com")
    .connect_src("'self'", "api.example.com")
)

# Apply it to secure headers
secure_headers = secure.Secure(csp=csp)
```

**Resulting HTTP headers:**

```http
Content-Security-Policy: default-src 'self'; script-src 'self' cdn.example.com; style-src 'unsafe-inline'; img-src 'self' images.example.com; connect-src 'self' api.example.com
```

### **Permissions-Policy Example**

```python
import secure

# Build a custom Permissions Policy
permissions = (
    secure.PermissionsPolicy()
    .geolocation("'self'")
    .camera("'none'")
    .microphone("'none'")
)

# Apply it to secure headers
secure_headers = secure.Secure(permissions=permissions)
```

**Resulting HTTP headers:**

```http
Permissions-Policy: geolocation=('self'), camera=('none'), microphone=('none')
```

---

## **Framework Examples**

### **FastAPI**

```python
from fastapi import FastAPI

from secure import Secure

app = FastAPI()
secure_headers = Secure.with_default_headers()


@app.middleware("http")
async def add_security_headers(request, call_next):
    response = await call_next(request)
    await secure_headers.set_headers_async(response)
    return response


@app.get("/")
def read_root():
    return {"Hello": "World"}
```

### Flask

```python
from flask import Flask, Response

from secure import Secure

app = Flask(__name__)
secure_headers = Secure.with_default_headers()


@app.after_request
def add_security_headers(response: Response):
    secure_headers.set_headers(response)
    return response


@app.route("/")
def home():
    return "Hello, world"


if __name__ == "__main__":
    app.run()
```

---

## **Documentation**

For more details, including advanced configurations and integration examples, please visit the **[full documentation](https://github.com/TypeError/secure/tree/main/docs)**.

---

## **Attribution**

This library implements security recommendations from trusted sources:

- [MDN Web Docs](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers) (licensed under [CC-BY-SA 2.5](https://creativecommons.org/licenses/by-sa/2.5/))
- [OWASP Secure Headers Project](https://owasp.org/www-project-secure-headers/) (licensed under [CC-BY-SA 4.0](https://creativecommons.org/licenses/by-sa/4.0/))

We have included attribution comments in the source code where appropriate.

---

## **Resources**

- [OWASP - Secure Headers Project](https://owasp.org/www-project-secure-headers/)
- [Mozilla Web Security Guidelines](https://infosec.mozilla.org/guidelines/web_security)
- [MDN Web Docs: Security Headers](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers#security)
- [web.dev: Security Best Practices](https://web.dev)
- [The World Wide Web Consortium (W3C)](https://www.w3.org)

---

### **License**

This project is licensed under the terms of the **[MIT License](https://opensource.org/licenses/MIT)**.

---

## **Contributing**

Contributions are welcome! If you'd like to contribute to `secure.py`, please feel free to open an issue or submit a pull request on **[GitHub](https://github.com/TypeError/secure)**.

---

## **Changelog**

For a detailed list of changes, please refer to the **[CHANGELOG](https://github.com/TypeError/secure/blob/main/CHANGELOG.md)**.

---

## **Acknowledgements**

We would like to thank the contributors of MDN Web Docs and OWASP Secure Headers Project for their invaluable resources and guidelines that help make the web a safer place.

            

Raw data

            {
    "_id": null,
    "home_page": null,
    "name": "secure",
    "maintainer": null,
    "docs_url": null,
    "requires_python": ">=3.10",
    "maintainer_email": null,
    "keywords": "security, headers, web, framework, HTTP",
    "author": null,
    "author_email": "Caleb Kinney <caleb@typeerror.com>",
    "download_url": "https://files.pythonhosted.org/packages/f8/15/d542b57612612d53a7b8bec468fade847173ab6f4dfd6026b640ff3a7648/secure-1.0.0.tar.gz",
    "platform": null,
    "description": "# secure.py\n\n_A simple, yet powerful way to secure your Python web applications across multiple frameworks._\n\n[![PyPI Version](https://img.shields.io/pypi/v/secure.svg)](https://pypi.org/project/secure/)\n[![Python Versions](https://img.shields.io/pypi/pyversions/secure.svg)](https://pypi.org/project/secure/)\n[![Ruff](https://img.shields.io/endpoint?url=https://raw.githubusercontent.com/astral-sh/ruff/main/assets/badge/v2.json)](https://github.com/astral-sh/ruff)\n[![Downloads](https://pepy.tech/badge/secure)](https://pepy.tech/project/secure)\n[![License](https://img.shields.io/pypi/l/secure.svg)](https://github.com/TypeError/secure/blob/main/LICENSE)\n[![GitHub Stars](https://img.shields.io/github/stars/TypeError/secure.svg)](https://github.com/TypeError/secure/stargazers)\n\n## **Introduction**\n\nIn today's web landscape, security is paramount. **secure.py** is a lightweight Python library designed to effortlessly add **security headers** to your web applications, protecting them from common vulnerabilities. Whether you're using **Django**, **Flask**, **FastAPI**, or any other popular framework, `secure.py` provides a unified API to enhance your application's security posture.\n\n---\n\n## **Why Use secure.py?**\n\n- \ud83d\udd12 **Apply Essential Security Headers**: Implement headers like CSP, HSTS, and more with minimal effort.\n- \ud83d\udee0\ufe0f **Consistent API Across Frameworks**: A unified approach for different web frameworks.\n- \u2699\ufe0f **Customizable with Secure Defaults**: Start secure out-of-the-box and customize as needed.\n- \ud83d\ude80 **Easy Integration**: Compatible with Python's most-used frameworks.\n- \ud83d\udc0d **Modern Pythonic Design**: Leverages Python 3.10+ features for cleaner and more efficient code.\n\n---\n\n## **Supported Frameworks**\n\n**secure.py** supports the following Python web frameworks:\n\n| Framework                                             | Documentation                                                                                    |\n| ----------------------------------------------------- | ------------------------------------------------------------------------------------------------ |\n| [aiohttp](https://docs.aiohttp.org)                   | [Integration Guide](https://github.com/TypeError/secure/blob/main/docs/frameworks.md#aiohttp)    |\n| [Bottle](https://bottlepy.org)                        | [Integration Guide](https://github.com/TypeError/secure/blob/main/docs/frameworks.md#bottle)     |\n| [CherryPy](https://cherrypy.dev/)                     | [Integration Guide](https://github.com/TypeError/secure/blob/main/docs/frameworks.md#cherrypy)   |\n| [Django](https://www.djangoproject.com)               | [Integration Guide](https://github.com/TypeError/secure/blob/main/docs/frameworks.md#django)     |\n| [Falcon](https://falconframework.org)                 | [Integration Guide](https://github.com/TypeError/secure/blob/main/docs/frameworks.md#falcon)     |\n| [FastAPI](https://fastapi.tiangolo.com)               | [Integration Guide](https://github.com/TypeError/secure/blob/main/docs/frameworks.md#fastapi)    |\n| [Flask](http://flask.pocoo.org)                       | [Integration Guide](https://github.com/TypeError/secure/blob/main/docs/frameworks.md#flask)      |\n| [Masonite](https://docs.masoniteproject.com/)         | [Integration Guide](https://github.com/TypeError/secure/blob/main/docs/frameworks.md#masonite)   |\n| [Morepath](https://morepath.readthedocs.io)           | [Integration Guide](https://github.com/TypeError/secure/blob/main/docs/frameworks.md#morepath)   |\n| [Pyramid](https://trypyramid.com)                     | [Integration Guide](https://github.com/TypeError/secure/blob/main/docs/frameworks.md#pyramid)    |\n| [Quart](https://quart.palletsprojects.com/en/latest/) | [Integration Guide](https://github.com/TypeError/secure/blob/main/docs/frameworks.md#quart)      |\n| [Responder](https://responder.kennethreitz.org/)      | [Integration Guide](https://github.com/TypeError/secure/blob/main/docs/frameworks.md#responder)  |\n| [Sanic](https://sanicframework.org)                   | [Integration Guide](https://github.com/TypeError/secure/blob/main/docs/frameworks.md#sanic)      |\n| [Starlette](https://www.starlette.io/)                | [Integration Guide](https://github.com/TypeError/secure/blob/main/docs/frameworks.md#starlette)  |\n| [Tornado](https://www.tornadoweb.org/)                | [Integration Guide](https://github.com/TypeError/secure/blob/main/docs/frameworks.md#tornado)    |\n| [TurboGears](https://turbogears.org/)                 | [Integration Guide](https://github.com/TypeError/secure/blob/main/docs/frameworks.md#turbogears) |\n\n---\n\n## **Features**\n\n- \ud83d\udd12 **Secure Headers**: Automatically apply headers like `Strict-Transport-Security`, `X-Frame-Options`, and more.\n- \ud83d\udee0\ufe0f **Customizable Policies**: Flexibly build your own security policies using method chaining.\n- \ud83c\udf10 **Framework Integration**: Compatible with various frameworks, ensuring cross-compatibility.\n- \ud83d\ude80 **No External Dependencies**: Lightweight and easy to include in any project.\n- \ud83e\udde9 **Easy to Use**: Integrate security headers in just a few lines of code.\n- \u26a1 **Asynchronous Support**: Async support for modern frameworks like **FastAPI** and **Starlette**.\n- \ud83d\udcdd **Enhanced Type Hinting**: Complete type annotations for better developer experience.\n- \ud83d\udcda **Attribution to Trusted Sources**: Implements recommendations from MDN and OWASP.\n\n---\n\n## **Requirements**\n\n- **Python 3.10** or higher\n\n  This library leverages modern Python features introduced in Python 3.10 and 3.11, such as:\n\n  - **Union Type Operator (`|`)**: Simplifies type annotations.\n  - **Structural Pattern Matching (`match` statement)**: Enhances control flow.\n  - **Improved Type Hinting and Annotations**: Provides better code clarity and maintenance.\n  - **`cached_property`**: Optimize memory usage and performance.\n\n  **Note:** If you're using an older version of Python (3.6 to 3.9), please use version **0.3.0** of this library, which maintains compatibility with those versions.\n\n- **Dependencies**\n\n  This library has no external dependencies outside of the Python Standard Library.\n\n---\n\n## **Installation**\n\nYou can install secure.py using pip, pipenv, or poetry:\n\n**pip**:\n\n```bash\npip install secure\n```\n\n**Pipenv**:\n\n```bash\npipenv install secure\n```\n\n**Poetry**:\n\n```bash\npoetry add secure\n```\n\n---\n\n## **Getting Started**\n\nOnce installed, you can quickly integrate `secure.py` into your project:\n\n### Synchronous Usage\n\n```python\nimport secure\n\n# Initialize secure headers with default settings\nsecure_headers = secure.Secure.with_default_headers()\n\n# Apply the headers to your framework response object\nsecure_headers.set_headers(response)\n```\n\n### Asynchronous Usage\n\nFor frameworks like **FastAPI** and **Starlette** that support asynchronous operations, use the async method:\n\n```python\nimport secure\n\n# Initialize secure headers with default settings\nsecure_headers = secure.Secure.with_default_headers()\n\n# Apply the headers asynchronously to your framework response object\nawait secure_headers.set_headers_async(response)\n```\n\n### **Example Usage**\n\n```python\nimport secure\n\n# Create a Secure instance with default headers\nsecure_headers = secure.Secure.with_default_headers()\n\n# Apply default secure headers to a response object\nsecure_headers.set_headers(response)\n```\n\n---\n\n## **Default Secure Headers**\n\nBy default, `secure.py` applies the following headers when using `with_default_headers()`:\n\n```http\nCache-Control: no-store\nCross-Origin-Opener-Policy: same-origin\nContent-Security-Policy: default-src 'self'; script-src 'self'; style-src 'self'; object-src 'none'\nStrict-Transport-Security: max-age=31536000\nPermissions-Policy: geolocation=(), microphone=(), camera=()\nReferrer-Policy: strict-origin-when-cross-origin\nServer:\nX-Content-Type-Options: nosniff\n```\n\n---\n\n## **Policy Builders**\n\n`secure.py` allows you to customize headers such as **Content-Security-Policy** and **Permissions-Policy** with ease:\n\n### **Content-Security-Policy Example**\n\n```python\nimport secure\n\n# Build a custom CSP policy\ncsp = (\n    secure.ContentSecurityPolicy()\n    .default_src(\"'self'\")\n    .script_src(\"'self'\", \"cdn.example.com\")\n    .style_src(\"'unsafe-inline'\")\n    .img_src(\"'self'\", \"images.example.com\")\n    .connect_src(\"'self'\", \"api.example.com\")\n)\n\n# Apply it to secure headers\nsecure_headers = secure.Secure(csp=csp)\n```\n\n**Resulting HTTP headers:**\n\n```http\nContent-Security-Policy: default-src 'self'; script-src 'self' cdn.example.com; style-src 'unsafe-inline'; img-src 'self' images.example.com; connect-src 'self' api.example.com\n```\n\n### **Permissions-Policy Example**\n\n```python\nimport secure\n\n# Build a custom Permissions Policy\npermissions = (\n    secure.PermissionsPolicy()\n    .geolocation(\"'self'\")\n    .camera(\"'none'\")\n    .microphone(\"'none'\")\n)\n\n# Apply it to secure headers\nsecure_headers = secure.Secure(permissions=permissions)\n```\n\n**Resulting HTTP headers:**\n\n```http\nPermissions-Policy: geolocation=('self'), camera=('none'), microphone=('none')\n```\n\n---\n\n## **Framework Examples**\n\n### **FastAPI**\n\n```python\nfrom fastapi import FastAPI\n\nfrom secure import Secure\n\napp = FastAPI()\nsecure_headers = Secure.with_default_headers()\n\n\n@app.middleware(\"http\")\nasync def add_security_headers(request, call_next):\n    response = await call_next(request)\n    await secure_headers.set_headers_async(response)\n    return response\n\n\n@app.get(\"/\")\ndef read_root():\n    return {\"Hello\": \"World\"}\n```\n\n### Flask\n\n```python\nfrom flask import Flask, Response\n\nfrom secure import Secure\n\napp = Flask(__name__)\nsecure_headers = Secure.with_default_headers()\n\n\n@app.after_request\ndef add_security_headers(response: Response):\n    secure_headers.set_headers(response)\n    return response\n\n\n@app.route(\"/\")\ndef home():\n    return \"Hello, world\"\n\n\nif __name__ == \"__main__\":\n    app.run()\n```\n\n---\n\n## **Documentation**\n\nFor more details, including advanced configurations and integration examples, please visit the **[full documentation](https://github.com/TypeError/secure/tree/main/docs)**.\n\n---\n\n## **Attribution**\n\nThis library implements security recommendations from trusted sources:\n\n- [MDN Web Docs](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers) (licensed under [CC-BY-SA 2.5](https://creativecommons.org/licenses/by-sa/2.5/))\n- [OWASP Secure Headers Project](https://owasp.org/www-project-secure-headers/) (licensed under [CC-BY-SA 4.0](https://creativecommons.org/licenses/by-sa/4.0/))\n\nWe have included attribution comments in the source code where appropriate.\n\n---\n\n## **Resources**\n\n- [OWASP - Secure Headers Project](https://owasp.org/www-project-secure-headers/)\n- [Mozilla Web Security Guidelines](https://infosec.mozilla.org/guidelines/web_security)\n- [MDN Web Docs: Security Headers](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers#security)\n- [web.dev: Security Best Practices](https://web.dev)\n- [The World Wide Web Consortium (W3C)](https://www.w3.org)\n\n---\n\n### **License**\n\nThis project is licensed under the terms of the **[MIT License](https://opensource.org/licenses/MIT)**.\n\n---\n\n## **Contributing**\n\nContributions are welcome! If you'd like to contribute to `secure.py`, please feel free to open an issue or submit a pull request on **[GitHub](https://github.com/TypeError/secure)**.\n\n---\n\n## **Changelog**\n\nFor a detailed list of changes, please refer to the **[CHANGELOG](https://github.com/TypeError/secure/blob/main/CHANGELOG.md)**.\n\n---\n\n## **Acknowledgements**\n\nWe would like to thank the contributors of MDN Web Docs and OWASP Secure Headers Project for their invaluable resources and guidelines that help make the web a safer place.\n",
    "bugtrack_url": null,
    "license": "MIT",
    "summary": "A lightweight package that adds security headers for Python web frameworks.",
    "version": "1.0.0",
    "project_urls": {
        "Documentation": "https://github.com/TypeError/secure/tree/main/docs",
        "Homepage": "https://github.com/TypeError/secure",
        "Issue-Tracker": "https://github.com/TypeError/secure/issues",
        "Repository": "https://github.com/TypeError/secure"
    },
    "split_keywords": [
        "security",
        " headers",
        " web",
        " framework",
        " http"
    ],
    "urls": [
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "7a24f70c4bf5cc9701bb64a231901a600424979794e5ec3843104538d78e9a74",
                "md5": "f06a7cc39b72c519e0388969b5a7d663",
                "sha256": "a82f57d23186a8d64ef6729d510a9e95ab0c4500f2d6bbf5cfc7f7675ca32564"
            },
            "downloads": -1,
            "filename": "secure-1.0.0-py3-none-any.whl",
            "has_sig": false,
            "md5_digest": "f06a7cc39b72c519e0388969b5a7d663",
            "packagetype": "bdist_wheel",
            "python_version": "py3",
            "requires_python": ">=3.10",
            "size": 26417,
            "upload_time": "2024-09-27T09:01:34",
            "upload_time_iso_8601": "2024-09-27T09:01:34.554931Z",
            "url": "https://files.pythonhosted.org/packages/7a/24/f70c4bf5cc9701bb64a231901a600424979794e5ec3843104538d78e9a74/secure-1.0.0-py3-none-any.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "f815d542b57612612d53a7b8bec468fade847173ab6f4dfd6026b640ff3a7648",
                "md5": "c57cbce5ec3ae5f612bf49c2b8ff169b",
                "sha256": "f9bf274681bc22b8b37df0ee8985d9972ee96409899d60560d373aa39c43b23c"
            },
            "downloads": -1,
            "filename": "secure-1.0.0.tar.gz",
            "has_sig": false,
            "md5_digest": "c57cbce5ec3ae5f612bf49c2b8ff169b",
            "packagetype": "sdist",
            "python_version": "source",
            "requires_python": ">=3.10",
            "size": 21216,
            "upload_time": "2024-09-27T09:01:35",
            "upload_time_iso_8601": "2024-09-27T09:01:35.561283Z",
            "url": "https://files.pythonhosted.org/packages/f8/15/d542b57612612d53a7b8bec468fade847173ab6f4dfd6026b640ff3a7648/secure-1.0.0.tar.gz",
            "yanked": false,
            "yanked_reason": null
        }
    ],
    "upload_time": "2024-09-27 09:01:35",
    "github": true,
    "gitlab": false,
    "bitbucket": false,
    "codeberg": false,
    "github_user": "TypeError",
    "github_project": "secure",
    "travis_ci": false,
    "coveralls": false,
    "github_actions": false,
    "lcname": "secure"
}
        
Elapsed time: 0.35293s