This commit is contained in:
2024-11-14 02:06:21 +08:00
commit 29ce03dbc5
24 changed files with 1042 additions and 0 deletions

0
short_url/__init__.py Normal file
View File

15
short_url/admin.py Normal file
View File

@ -0,0 +1,15 @@
from django.contrib import admin
from .models import ShortUrl
@admin.register(ShortUrl)
class ShortUrlAdmin(admin.ModelAdmin):
list_display = (
"id",
"alias",
"target",
"created_at",
"updated_at",
)
search_fields = ["alias", "target"]

6
short_url/apps.py Normal file
View File

@ -0,0 +1,6 @@
from django.apps import AppConfig
class ShortUrlConfig(AppConfig):
default_auto_field = 'django.db.models.BigAutoField'
name = 'short_url'

View File

@ -0,0 +1,25 @@
# Generated by Django 5.1.3 on 2024-11-12 14:00
import url_shortener.utils
from django.db import migrations, models
class Migration(migrations.Migration):
initial = True
dependencies = [
]
operations = [
migrations.CreateModel(
name='ShortUrl',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('alias', models.CharField(default=url_shortener.utils.generate_random_string_3, max_length=120, unique=True)),
('target', models.URLField()),
('created_at', models.DateTimeField(auto_now_add=True)),
('updated_at', models.DateTimeField(auto_now=True)),
],
),
]

View File

12
short_url/models.py Normal file
View File

@ -0,0 +1,12 @@
from django.db import models
from url_shortener.utils import generate_random_string_3
class ShortUrl(models.Model):
alias = models.CharField(
max_length=120, unique=True, default=generate_random_string_3
)
target = models.URLField()
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True)

3
short_url/tests.py Normal file
View File

@ -0,0 +1,3 @@
from django.test import TestCase
# Create your tests here.

14
short_url/views.py Normal file
View File

@ -0,0 +1,14 @@
from django.http import HttpResponse
from django.shortcuts import get_object_or_404
from django.views.decorators.csrf import csrf_exempt
from .models import ShortUrl
@csrf_exempt
def redirect_to_target(request, alias):
short_url = get_object_or_404(ShortUrl, alias=alias)
response = HttpResponse(status=307)
response['Location'] = short_url.target
return response