Сокращенное перенаправление ссылок

John Fekoter спросил: 31 июля 2018 в 09:51 в: python

Я делаю ссылку на django. Интересно, как я могу перенаправить сокращенный URL-адрес на его оригинал. Например, у меня есть ссылка 127.0.0.1:8000/ZY9J3y, и мне нужно передать ее в facebook.com. Вопрос в том, что я должен добавить в свой url.py, чтобы перенаправить ссылки, подобные этому, на их оригинальные.


3 ответа

John Fekoter ответил: 01 августа 2018 в 06:38
У меня есть модель, которая сопоставляет сгенерированные короткие ссылки и оригинальные ссылки, и мне удалось извлечь оригинальные URL-адреса и перенаправить их, но возникла проблема, когда URL-адрес не имеет http:// перед адресом, он будет перенаправлен в неизвестное местоположение локальный / shortenerapp / www.example.com. Так что youtube.com не будет перенаправлять меня на youtube, но"https:// youtube.com" будет. Как я могу управлять им, чтобы перенаправлять напрямую по указанному URL, а не добавлять URL к URL моего сайта ??
Will Keeling ответил: 01 августа 2018 в 07:12
Да, без "http://" URL считается относительным и будет добавлен к текущему пути. Везде, где ваш код извлекает исходную ссылку из короткой ссылки, он должен вручную проверять префикс "http" (схема) и, если его нет, ставить "http" перед исходной ссылкой, прежде чем возвращать ее.
Julien Kieffer ответил: 31 июля 2018 в 12:29

Возможно, вы захотите использовать для этого определенную модель:

models.py

class Redirection(models.Model):
    shortened = models.CharField("Shortened URL", max_length=50)
    url = models.URLField("Url", help_text='Your shortened URI will be computed')    class Meta:
        verbose_name = "Redirection"
        verbose_name_plural = "Redirections"    def save(self, *args, **kwargs):
        if not self.shortened:
            self.shortened = self.computed_hash
        super(Redirection, self).save(*args, **kwargs)    @property
    def computed_hash(self):
        return your_hashing_algo(self.url)

urls. py

from .views import redirecturlpatterns = [
    path('(?P<surl>[a-zA-Z0-9_-]+)/', redirect)
]

Наконец, views.py

from django.views.decorators.cache import cache_page
from django.shortcuts import (get_object_or_404, redirect)
from .models import Redirection@cache_page(3600)
def redirect(request, surl):
    url = get_object_or_404(Redirection,shortened=surl)
    return redirect(url)

Вы можете легко настроить это вокруг, чтобы дать модели срок службы, счетчик перенаправления (хотя позаботьтесь о кеше!)