From aa8ae37799cd9fc24231b6c803da767838b7b9de Mon Sep 17 00:00:00 2001 From: acidburnmonkey Date: Wed, 6 Aug 2025 01:03:53 -0400 Subject: [PATCH] initial commit done , pre peoduction --- .gitignore | 7 ++ .python-version | 1 + README.md | 0 manage.py | 22 ++++++ mysite/__init__.py | 0 mysite/asgi.py | 16 ++++ mysite/settings.py | 129 ++++++++++++++++++++++++++++++ mysite/urls.py | 10 +++ mysite/views.py | 41 ++++++++++ mysite/wsgi.py | 16 ++++ pyproject.toml | 13 +++ static/GlitchGoblin.ttf | Bin 0 -> 37368 bytes static/scripts.js | 34 ++++++++ static/scripts.ts | 53 +++++++++++++ static/styles.css | 37 +++++++++ templates/home.html | 45 +++++++++++ templates/robots.txt | 13 +++ uv.lock | 170 ++++++++++++++++++++++++++++++++++++++++ 18 files changed, 607 insertions(+) create mode 100644 .gitignore create mode 100644 .python-version create mode 100644 README.md create mode 100755 manage.py create mode 100644 mysite/__init__.py create mode 100644 mysite/asgi.py create mode 100644 mysite/settings.py create mode 100644 mysite/urls.py create mode 100644 mysite/views.py create mode 100644 mysite/wsgi.py create mode 100644 pyproject.toml create mode 100644 static/GlitchGoblin.ttf create mode 100644 static/scripts.js create mode 100644 static/scripts.ts create mode 100644 static/styles.css create mode 100644 templates/home.html create mode 100644 templates/robots.txt create mode 100644 uv.lock diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..c7c3759 --- /dev/null +++ b/.gitignore @@ -0,0 +1,7 @@ +db.sqlite3 +.venv +.env +**.env** +__pycache__ +**__pycache__** +test.py diff --git a/.python-version b/.python-version new file mode 100644 index 0000000..24ee5b1 --- /dev/null +++ b/.python-version @@ -0,0 +1 @@ +3.13 diff --git a/README.md b/README.md new file mode 100644 index 0000000..e69de29 diff --git a/manage.py b/manage.py new file mode 100755 index 0000000..a7da667 --- /dev/null +++ b/manage.py @@ -0,0 +1,22 @@ +#!/usr/bin/env python +"""Django's command-line utility for administrative tasks.""" +import os +import sys + + +def main(): + """Run administrative tasks.""" + os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'mysite.settings') + try: + from django.core.management import execute_from_command_line + except ImportError as exc: + raise ImportError( + "Couldn't import Django. Are you sure it's installed and " + "available on your PYTHONPATH environment variable? Did you " + "forget to activate a virtual environment?" + ) from exc + execute_from_command_line(sys.argv) + + +if __name__ == '__main__': + main() diff --git a/mysite/__init__.py b/mysite/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/mysite/asgi.py b/mysite/asgi.py new file mode 100644 index 0000000..4e0d84c --- /dev/null +++ b/mysite/asgi.py @@ -0,0 +1,16 @@ +""" +ASGI config for mysite project. + +It exposes the ASGI callable as a module-level variable named ``application``. + +For more information on this file, see +https://docs.djangoproject.com/en/5.2/howto/deployment/asgi/ +""" + +import os + +from django.core.asgi import get_asgi_application + +os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'mysite.settings') + +application = get_asgi_application() diff --git a/mysite/settings.py b/mysite/settings.py new file mode 100644 index 0000000..f4121e0 --- /dev/null +++ b/mysite/settings.py @@ -0,0 +1,129 @@ +""" +Django settings for mysite project. + +Generated by 'django-admin startproject' using Django 5.2.4. + +For more information on this file, see +https://docs.djangoproject.com/en/5.2/topics/settings/ + +For the full list of settings and their values, see +https://docs.djangoproject.com/en/5.2/ref/settings/ +""" + +from pathlib import Path + +# Build paths inside the project like this: BASE_DIR / 'subdir'. +BASE_DIR = Path(__file__).resolve().parent.parent + + +# Quick-start development settings - unsuitable for production +# See https://docs.djangoproject.com/en/5.2/howto/deployment/checklist/ + +# SECURITY WARNING: keep the secret key used in production secret! +SECRET_KEY = 'django-insecure-jl%+_1sb3!uvg#1(jdk-q9bhu&4b*n(xy+$cz4n43gnl@=fx*_' + +# SECURITY WARNING: don't run with debug turned on in production! +DEBUG = True + +ALLOWED_HOSTS = [] + + +# Application definition + +INSTALLED_APPS = [ + 'rest_framework', + 'django.contrib.admin', + 'django.contrib.auth', + 'django.contrib.contenttypes', + 'django.contrib.sessions', + 'django.contrib.messages', + 'django.contrib.staticfiles', +] + +MIDDLEWARE = [ + 'django.middleware.security.SecurityMiddleware', + 'django.contrib.sessions.middleware.SessionMiddleware', + 'django.middleware.common.CommonMiddleware', + 'django.middleware.csrf.CsrfViewMiddleware', + 'django.contrib.auth.middleware.AuthenticationMiddleware', + 'django.contrib.messages.middleware.MessageMiddleware', + 'django.middleware.clickjacking.XFrameOptionsMiddleware', +] + +ROOT_URLCONF = 'mysite.urls' + +TEMPLATES = [ + { + 'BACKEND': 'django.template.backends.django.DjangoTemplates', + 'DIRS': [ + 'templates', + ], + 'APP_DIRS': True, + 'OPTIONS': { + 'context_processors': [ + 'django.template.context_processors.request', + 'django.contrib.auth.context_processors.auth', + 'django.contrib.messages.context_processors.messages', + ], + }, + }, +] + +WSGI_APPLICATION = 'mysite.wsgi.application' + + +# Database +# https://docs.djangoproject.com/en/5.2/ref/settings/#databases + +DATABASES = { + 'default': { + 'ENGINE': 'django.db.backends.sqlite3', + 'NAME': BASE_DIR / 'db.sqlite3', + } +} + + +# Password validation +# https://docs.djangoproject.com/en/5.2/ref/settings/#auth-password-validators + +AUTH_PASSWORD_VALIDATORS = [ + { + 'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator', + }, + { + 'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator', + }, + { + 'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator', + }, + { + 'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator', + }, +] + + +# Internationalization +# https://docs.djangoproject.com/en/5.2/topics/i18n/ + +LANGUAGE_CODE = 'en-us' + +TIME_ZONE = 'UTC' + +USE_I18N = True + +USE_TZ = True + + +# Static files (CSS, JavaScript, Images) +# https://docs.djangoproject.com/en/5.2/howto/static-files/ + +STATIC_URL = 'static/' + +STATICFILES_DIRS = [ + BASE_DIR / "static", +] + +# Default primary key field type +# https://docs.djangoproject.com/en/5.2/ref/settings/#default-auto-field + +DEFAULT_AUTO_FIELD = 'django.db.models.BigAutoField' diff --git a/mysite/urls.py b/mysite/urls.py new file mode 100644 index 0000000..ac4937d --- /dev/null +++ b/mysite/urls.py @@ -0,0 +1,10 @@ +from django.urls import path +from .views import Doxme, home, robots + + + +urlpatterns = [ + path('home/', home), + path('robots.txt/', robots), + path('doxme/', Doxme.as_view()), +] diff --git a/mysite/views.py b/mysite/views.py new file mode 100644 index 0000000..8f0deb4 --- /dev/null +++ b/mysite/views.py @@ -0,0 +1,41 @@ +from django.shortcuts import render +from rest_framework import status +from rest_framework.response import Response +from rest_framework.views import APIView + +from dotenv import load_dotenv +import os +import requests + +load_dotenv() + + +def home(request): + return render(request, 'home.html') + + +def robots(request): + return render(request, 'robots.txt') + + +class Doxme(APIView): + def get_client_ip(self, request): + """Get the user's IP from the request headers""" + x_forwarded_for = request.META.get('HTTP_X_FORWARDED_FOR') + if x_forwarded_for: + ip = x_forwarded_for.split(',')[0] # First IP in the chain + else: + ip = request.META.get('REMOTE_ADDR') + return ip + + def get(self, request): + client_ip = self.get_client_ip(request) + + token = os.getenv('TOKEN') + url = f'http://api.ipinfo.io/lite/{client_ip}?token={token}' + ip_info = requests.get(url) + + if ip_info.ok and not ip_info.json().get('bogon'): + print(ip_info) + return Response({'method': 'get', 'ip_info': ip_info.json()}, status=status.HTTP_200_OK) + return Response({'message': 'error at ipinfo'}, status=status.HTTP_400_BAD_REQUEST) diff --git a/mysite/wsgi.py b/mysite/wsgi.py new file mode 100644 index 0000000..35e1b4d --- /dev/null +++ b/mysite/wsgi.py @@ -0,0 +1,16 @@ +""" +WSGI config for mysite project. + +It exposes the WSGI callable as a module-level variable named ``application``. + +For more information on this file, see +https://docs.djangoproject.com/en/5.2/howto/deployment/wsgi/ +""" + +import os + +from django.core.wsgi import get_wsgi_application + +os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'mysite.settings') + +application = get_wsgi_application() diff --git a/pyproject.toml b/pyproject.toml new file mode 100644 index 0000000..6505828 --- /dev/null +++ b/pyproject.toml @@ -0,0 +1,13 @@ +[project] +name = "mysite" +version = "0.1.0" +description = "Home page for acidarchon.com" +readme = "README.md" +requires-python = ">=3.13" +dependencies = [ + "django>=5.2.4", + "djangorestframework>=3.16.0", + "djangorestframework-types>=0.9.0", + "dotenv>=0.9.9", + "requests>=2.32.4", +] diff --git a/static/GlitchGoblin.ttf b/static/GlitchGoblin.ttf new file mode 100644 index 0000000000000000000000000000000000000000..708b56884e059363befae6e4667e1808d95054f8 GIT binary patch literal 37368 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 response.json()) + .then((jsonResponse) => { + const user_ip = jsonResponse.ip_info.ip; + const user_country = jsonResponse.ip_info.country; + const user_region = jsonResponse.ip_info.country_code; + + // Update the HTML elements with the fetched information + document.getElementById('ip').textContent = `${user_ip}`; + document.getElementById('country').textContent = `${user_country}`; + document.getElementById('region').textContent = `${user_region}`; + + console.log('user_ip:', user_ip); + console.log('couintry:', user_country); + console.log('region:', user_region); + }) + .catch((error) => { + console.error('Error fetching IP information:', error); + }); + +fetch('http://ip-api.com/json/') + .then((response) => response.json()) + .then((data) => { + const user_city = data.city; + const user_isp = data.isp; + console.log('user_city', user_city); + console.log('user_isp', user_isp); + + document.getElementById('city').textContent = `${user_city}`; + document.getElementById('isp').textContent = `${user_isp}`; + }) + .catch((err) => { + console.log('idk error', err); + }); diff --git a/static/styles.css b/static/styles.css new file mode 100644 index 0000000..41d5c14 --- /dev/null +++ b/static/styles.css @@ -0,0 +1,37 @@ +@font-face { + font-family: GlitchGoblin; + src: url('GlitchGoblin.ttf'); +} + +h1 { + font-size: 60px; + color: red; + margin-left: auto; + margin-right: auto; + margin-bottom: 80px; + width: 10em; + font-family: GlitchGoblin; +} + +.info { + margin-bottom: 20px; +} + +.info h2 { + margin-right: 10px; + display: inline; + color: red; +} + +.info p { + display: inline-block; + margin: inline; +} + +body { + background: #121212; +} + +p { + color: red; +} diff --git a/templates/home.html b/templates/home.html new file mode 100644 index 0000000..ce9d858 --- /dev/null +++ b/templates/home.html @@ -0,0 +1,45 @@ + +{% load static %} + + + + + Who are you? + + + +

+ U HAVE THREAD
+ UPON MY DOMAIN
+ & MUST SUFFER
+ WHO R U? +

+ +
+
+

IP Address:

+

Loading...

+
+
+

Country:

+

Loading...

+
+
+

City:

+

Loading...

+
+
+

Region:

+

Loading...

+
+ +
+

Internet Provider:

+

Loading...

+
+
+ + + + + diff --git a/templates/robots.txt b/templates/robots.txt new file mode 100644 index 0000000..6dc7a4c --- /dev/null +++ b/templates/robots.txt @@ -0,0 +1,13 @@ +User-agent: ia_archiver +Disallow: / + +User-agent: archive.org_bot +Disallow: / + +User-agent: Googlebot +User-agent: AdsBot-Google +Disallow: / + +#Example of how to block all crawlers +User-agent: * +Disallow: / diff --git a/uv.lock b/uv.lock new file mode 100644 index 0000000..caa6878 --- /dev/null +++ b/uv.lock @@ -0,0 +1,170 @@ +version = 1 +revision = 2 +requires-python = ">=3.13" + +[[package]] +name = "asgiref" +version = "3.9.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/90/61/0aa957eec22ff70b830b22ff91f825e70e1ef732c06666a805730f28b36b/asgiref-3.9.1.tar.gz", hash = "sha256:a5ab6582236218e5ef1648f242fd9f10626cfd4de8dc377db215d5d5098e3142", size = 36870, upload-time = "2025-07-08T09:07:43.344Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/7c/3c/0464dcada90d5da0e71018c04a140ad6349558afb30b3051b4264cc5b965/asgiref-3.9.1-py3-none-any.whl", hash = "sha256:f3bba7092a48005b5f5bacd747d36ee4a5a61f4a269a6df590b43144355ebd2c", size = 23790, upload-time = "2025-07-08T09:07:41.548Z" }, +] + +[[package]] +name = "certifi" +version = "2025.8.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/dc/67/960ebe6bf230a96cda2e0abcf73af550ec4f090005363542f0765df162e0/certifi-2025.8.3.tar.gz", hash = "sha256:e564105f78ded564e3ae7c923924435e1daa7463faeab5bb932bc53ffae63407", size = 162386, upload-time = "2025-08-03T03:07:47.08Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e5/48/1549795ba7742c948d2ad169c1c8cdbae65bc450d6cd753d124b17c8cd32/certifi-2025.8.3-py3-none-any.whl", hash = "sha256:f6c12493cfb1b06ba2ff328595af9350c65d6644968e5d3a2ffd78699af217a5", size = 161216, upload-time = "2025-08-03T03:07:45.777Z" }, +] + +[[package]] +name = "charset-normalizer" +version = "3.4.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/e4/33/89c2ced2b67d1c2a61c19c6751aa8902d46ce3dacb23600a283619f5a12d/charset_normalizer-3.4.2.tar.gz", hash = "sha256:5baececa9ecba31eff645232d59845c07aa030f0c81ee70184a90d35099a0e63", size = 126367, upload-time = "2025-05-02T08:34:42.01Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ea/12/a93df3366ed32db1d907d7593a94f1fe6293903e3e92967bebd6950ed12c/charset_normalizer-3.4.2-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:926ca93accd5d36ccdabd803392ddc3e03e6d4cd1cf17deff3b989ab8e9dbcf0", size = 199622, upload-time = "2025-05-02T08:32:56.363Z" }, + { url = "https://files.pythonhosted.org/packages/04/93/bf204e6f344c39d9937d3c13c8cd5bbfc266472e51fc8c07cb7f64fcd2de/charset_normalizer-3.4.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:eba9904b0f38a143592d9fc0e19e2df0fa2e41c3c3745554761c5f6447eedabf", size = 143435, upload-time = "2025-05-02T08:32:58.551Z" }, + { url = "https://files.pythonhosted.org/packages/22/2a/ea8a2095b0bafa6c5b5a55ffdc2f924455233ee7b91c69b7edfcc9e02284/charset_normalizer-3.4.2-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3fddb7e2c84ac87ac3a947cb4e66d143ca5863ef48e4a5ecb83bd48619e4634e", size = 153653, upload-time = "2025-05-02T08:33:00.342Z" }, + { url = "https://files.pythonhosted.org/packages/b6/57/1b090ff183d13cef485dfbe272e2fe57622a76694061353c59da52c9a659/charset_normalizer-3.4.2-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:98f862da73774290f251b9df8d11161b6cf25b599a66baf087c1ffe340e9bfd1", size = 146231, upload-time = "2025-05-02T08:33:02.081Z" }, + { url = "https://files.pythonhosted.org/packages/e2/28/ffc026b26f441fc67bd21ab7f03b313ab3fe46714a14b516f931abe1a2d8/charset_normalizer-3.4.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6c9379d65defcab82d07b2a9dfbfc2e95bc8fe0ebb1b176a3190230a3ef0e07c", size = 148243, upload-time = "2025-05-02T08:33:04.063Z" }, + { url = "https://files.pythonhosted.org/packages/c0/0f/9abe9bd191629c33e69e47c6ef45ef99773320e9ad8e9cb08b8ab4a8d4cb/charset_normalizer-3.4.2-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e635b87f01ebc977342e2697d05b56632f5f879a4f15955dfe8cef2448b51691", size = 150442, upload-time = "2025-05-02T08:33:06.418Z" }, + { url = "https://files.pythonhosted.org/packages/67/7c/a123bbcedca91d5916c056407f89a7f5e8fdfce12ba825d7d6b9954a1a3c/charset_normalizer-3.4.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:1c95a1e2902a8b722868587c0e1184ad5c55631de5afc0eb96bc4b0d738092c0", size = 145147, upload-time = "2025-05-02T08:33:08.183Z" }, + { url = "https://files.pythonhosted.org/packages/ec/fe/1ac556fa4899d967b83e9893788e86b6af4d83e4726511eaaad035e36595/charset_normalizer-3.4.2-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:ef8de666d6179b009dce7bcb2ad4c4a779f113f12caf8dc77f0162c29d20490b", size = 153057, upload-time = "2025-05-02T08:33:09.986Z" }, + { url = "https://files.pythonhosted.org/packages/2b/ff/acfc0b0a70b19e3e54febdd5301a98b72fa07635e56f24f60502e954c461/charset_normalizer-3.4.2-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:32fc0341d72e0f73f80acb0a2c94216bd704f4f0bce10aedea38f30502b271ff", size = 156454, upload-time = "2025-05-02T08:33:11.814Z" }, + { url = "https://files.pythonhosted.org/packages/92/08/95b458ce9c740d0645feb0e96cea1f5ec946ea9c580a94adfe0b617f3573/charset_normalizer-3.4.2-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:289200a18fa698949d2b39c671c2cc7a24d44096784e76614899a7ccf2574b7b", size = 154174, upload-time = "2025-05-02T08:33:13.707Z" }, + { url = "https://files.pythonhosted.org/packages/78/be/8392efc43487ac051eee6c36d5fbd63032d78f7728cb37aebcc98191f1ff/charset_normalizer-3.4.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:4a476b06fbcf359ad25d34a057b7219281286ae2477cc5ff5e3f70a246971148", size = 149166, upload-time = "2025-05-02T08:33:15.458Z" }, + { url = "https://files.pythonhosted.org/packages/44/96/392abd49b094d30b91d9fbda6a69519e95802250b777841cf3bda8fe136c/charset_normalizer-3.4.2-cp313-cp313-win32.whl", hash = "sha256:aaeeb6a479c7667fbe1099af9617c83aaca22182d6cf8c53966491a0f1b7ffb7", size = 98064, upload-time = "2025-05-02T08:33:17.06Z" }, + { url = "https://files.pythonhosted.org/packages/e9/b0/0200da600134e001d91851ddc797809e2fe0ea72de90e09bec5a2fbdaccb/charset_normalizer-3.4.2-cp313-cp313-win_amd64.whl", hash = "sha256:aa6af9e7d59f9c12b33ae4e9450619cf2488e2bbe9b44030905877f0b2324980", size = 105641, upload-time = "2025-05-02T08:33:18.753Z" }, + { url = "https://files.pythonhosted.org/packages/20/94/c5790835a017658cbfabd07f3bfb549140c3ac458cfc196323996b10095a/charset_normalizer-3.4.2-py3-none-any.whl", hash = "sha256:7f56930ab0abd1c45cd15be65cc741c28b1c9a34876ce8c17a2fa107810c0af0", size = 52626, upload-time = "2025-05-02T08:34:40.053Z" }, +] + +[[package]] +name = "django" +version = "5.2.4" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "asgiref" }, + { name = "sqlparse" }, + { name = "tzdata", marker = "sys_platform == 'win32'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/9c/7e/034f0f9fb10c029a02daaf44d364d6bf2eced8c73f0d38c69da359d26b01/django-5.2.4.tar.gz", hash = "sha256:a1228c384f8fa13eebc015196db7b3e08722c5058d4758d20cb287503a540d8f", size = 10831909, upload-time = "2025-07-02T18:47:39.19Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/14/ae/706965237a672434c8b520e89a818e8b047af94e9beb342d0bee405c26c7/django-5.2.4-py3-none-any.whl", hash = "sha256:60c35bd96201b10c6e7a78121bd0da51084733efa303cc19ead021ab179cef5e", size = 8302187, upload-time = "2025-07-02T18:47:35.373Z" }, +] + +[[package]] +name = "djangorestframework" +version = "3.16.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "django" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/7d/97/112c5a72e6917949b6d8a18ad6c6e72c46da4290c8f36ee5f1c1dcbc9901/djangorestframework-3.16.0.tar.gz", hash = "sha256:f022ff46613584de994c0c6a4aebbace5fd700555fbe9d33b865ebf173eba6c9", size = 1068408, upload-time = "2025-03-28T14:18:42.065Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/eb/3e/2448e93f4f87fc9a9f35e73e3c05669e0edd0c2526834686e949bb1fd303/djangorestframework-3.16.0-py3-none-any.whl", hash = "sha256:bea7e9f6b96a8584c5224bfb2e4348dfb3f8b5e34edbecb98da258e892089361", size = 1067305, upload-time = "2025-03-28T14:18:39.489Z" }, +] + +[[package]] +name = "djangorestframework-types" +version = "0.9.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/d6/5d/1a21a5fd10ad9980dcb934b8221934dee2b6b97af5edc58cb169558c0831/djangorestframework_types-0.9.0.tar.gz", hash = "sha256:aa6b27fbdab5ff4ab1dfa5376f3b6ec45713ce48dbcdd4226bf3e1410f0deaca", size = 32521, upload-time = "2024-10-10T00:42:04.01Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a4/5f/d908ce938356b209d4d27a7fb159ab9100b8814396a69c0204bb66e38703/djangorestframework_types-0.9.0-py3-none-any.whl", hash = "sha256:5e4258fe43774d0a3d018780170bd702bf615407fe244453ea5ec6e6676b98c4", size = 54947, upload-time = "2024-10-10T00:42:02.311Z" }, +] + +[[package]] +name = "dotenv" +version = "0.9.9" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "python-dotenv" }, +] +wheels = [ + { url = "https://files.pythonhosted.org/packages/b2/b7/545d2c10c1fc15e48653c91efde329a790f2eecfbbf2bd16003b5db2bab0/dotenv-0.9.9-py2.py3-none-any.whl", hash = "sha256:29cf74a087b31dafdb5a446b6d7e11cbce8ed2741540e2339c69fbef92c94ce9", size = 1892, upload-time = "2025-02-19T22:15:01.647Z" }, +] + +[[package]] +name = "idna" +version = "3.10" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/f1/70/7703c29685631f5a7590aa73f1f1d3fa9a380e654b86af429e0934a32f7d/idna-3.10.tar.gz", hash = "sha256:12f65c9b470abda6dc35cf8e63cc574b1c52b11df2c86030af0ac09b01b13ea9", size = 190490, upload-time = "2024-09-15T18:07:39.745Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/76/c6/c88e154df9c4e1a2a66ccf0005a88dfb2650c1dffb6f5ce603dfbd452ce3/idna-3.10-py3-none-any.whl", hash = "sha256:946d195a0d259cbba61165e88e65941f16e9b36ea6ddb97f00452bae8b1287d3", size = 70442, upload-time = "2024-09-15T18:07:37.964Z" }, +] + +[[package]] +name = "mysite" +version = "0.1.0" +source = { virtual = "." } +dependencies = [ + { name = "django" }, + { name = "djangorestframework" }, + { name = "djangorestframework-types" }, + { name = "dotenv" }, + { name = "requests" }, +] + +[package.metadata] +requires-dist = [ + { name = "django", specifier = ">=5.2.4" }, + { name = "djangorestframework", specifier = ">=3.16.0" }, + { name = "djangorestframework-types", specifier = ">=0.9.0" }, + { name = "dotenv", specifier = ">=0.9.9" }, + { name = "requests", specifier = ">=2.32.4" }, +] + +[[package]] +name = "python-dotenv" +version = "1.1.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/f6/b0/4bc07ccd3572a2f9df7e6782f52b0c6c90dcbb803ac4a167702d7d0dfe1e/python_dotenv-1.1.1.tar.gz", hash = "sha256:a8a6399716257f45be6a007360200409fce5cda2661e3dec71d23dc15f6189ab", size = 41978, upload-time = "2025-06-24T04:21:07.341Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/5f/ed/539768cf28c661b5b068d66d96a2f155c4971a5d55684a514c1a0e0dec2f/python_dotenv-1.1.1-py3-none-any.whl", hash = "sha256:31f23644fe2602f88ff55e1f5c79ba497e01224ee7737937930c448e4d0e24dc", size = 20556, upload-time = "2025-06-24T04:21:06.073Z" }, +] + +[[package]] +name = "requests" +version = "2.32.4" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "certifi" }, + { name = "charset-normalizer" }, + { name = "idna" }, + { name = "urllib3" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/e1/0a/929373653770d8a0d7ea76c37de6e41f11eb07559b103b1c02cafb3f7cf8/requests-2.32.4.tar.gz", hash = "sha256:27d0316682c8a29834d3264820024b62a36942083d52caf2f14c0591336d3422", size = 135258, upload-time = "2025-06-09T16:43:07.34Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/7c/e4/56027c4a6b4ae70ca9de302488c5ca95ad4a39e190093d6c1a8ace08341b/requests-2.32.4-py3-none-any.whl", hash = "sha256:27babd3cda2a6d50b30443204ee89830707d396671944c998b5975b031ac2b2c", size = 64847, upload-time = "2025-06-09T16:43:05.728Z" }, +] + +[[package]] +name = "sqlparse" +version = "0.5.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/e5/40/edede8dd6977b0d3da179a342c198ed100dd2aba4be081861ee5911e4da4/sqlparse-0.5.3.tar.gz", hash = "sha256:09f67787f56a0b16ecdbde1bfc7f5d9c3371ca683cfeaa8e6ff60b4807ec9272", size = 84999, upload-time = "2024-12-10T12:05:30.728Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a9/5c/bfd6bd0bf979426d405cc6e71eceb8701b148b16c21d2dc3c261efc61c7b/sqlparse-0.5.3-py3-none-any.whl", hash = "sha256:cf2196ed3418f3ba5de6af7e82c694a9fbdbfecccdfc72e281548517081f16ca", size = 44415, upload-time = "2024-12-10T12:05:27.824Z" }, +] + +[[package]] +name = "tzdata" +version = "2025.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/95/32/1a225d6164441be760d75c2c42e2780dc0873fe382da3e98a2e1e48361e5/tzdata-2025.2.tar.gz", hash = "sha256:b60a638fcc0daffadf82fe0f57e53d06bdec2f36c4df66280ae79bce6bd6f2b9", size = 196380, upload-time = "2025-03-23T13:54:43.652Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/5c/23/c7abc0ca0a1526a0774eca151daeb8de62ec457e77262b66b359c3c7679e/tzdata-2025.2-py2.py3-none-any.whl", hash = "sha256:1a403fada01ff9221ca8044d701868fa132215d84beb92242d9acd2147f667a8", size = 347839, upload-time = "2025-03-23T13:54:41.845Z" }, +] + +[[package]] +name = "urllib3" +version = "2.5.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/15/22/9ee70a2574a4f4599c47dd506532914ce044817c7752a79b6a51286319bc/urllib3-2.5.0.tar.gz", hash = "sha256:3fc47733c7e419d4bc3f6b3dc2b4f890bb743906a30d56ba4a5bfa4bbff92760", size = 393185, upload-time = "2025-06-18T14:07:41.644Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a7/c2/fe1e52489ae3122415c51f387e221dd0773709bad6c6cdaa599e8a2c5185/urllib3-2.5.0-py3-none-any.whl", hash = "sha256:e6b01673c0fa6a13e374b50871808eb3bf7046c4b125b216f6bf1cc604cff0dc", size = 129795, upload-time = "2025-06-18T14:07:40.39Z" }, +]