Name | secure JSON |
Version |
1.0.0
JSON |
| download |
home_page | None |
Summary | A lightweight package that adds security headers for Python web frameworks. |
upload_time | 2024-09-27 09:01:35 |
maintainer | None |
docs_url | None |
author | None |
requires_python | >=3.10 |
license | MIT |
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"
}