django简单实现短url

一、短url的原理

什么是短url:

简单讲就是把普通正常访问的网址,转换成比较短的网址,例如:https://www.cnblogs.com/angelyan/articles/10667354.html#_label0 转成https://dwz.cn/p8VGVkMt

作用优点:短,字符少,美观,便于发布,传播,突破某些平台限制

原理步骤:

1.浏览器解析DNS,获取域名对应的ip

2.获取ip,发送http请求,获取p8VGVkMt对应的长链接地址

3.http通过301重定向,转到对应的长链接页面

算法原理:

利用数据库自增id,每一次短url获取一个数据库id,将id进行62进制转换,获得一个短码,这样的短码最长8位,最短1位。

二、代码部分

#url路由部分

from django.conf.urls import url
from django.contrib import admin
from app01 import views

urlpatterns = [
    url(r‘^admin/‘, admin.site.urls),
    url(r‘^$‘, views.index),
    url(r‘^addShortUrl/$‘, views.addShortUrl),
    url(r‘^restoreUrl/$‘, views.restoreUrl),
    url(r‘^([A-Za-z0-9]+)/‘, views.url),

]
#模型表部分
from django.db import models

# Create your models here.

# 短url表
class ShortUrl(models.Model):
    id=models.AutoField(primary_key=True)
    # 短url
    short_url=models.CharField(max_length=255)
    # 原始url
    ori_url = models.TextField()
    # 短url有效期
    period=models.DateTimeField()

    def __str__(self):
        return self.short_url
#视图view部分

from django.shortcuts import render,redirect
from django.http import HttpResponse,JsonResponse

# Create your views here.
import re,datetime,time
from app01 import models

baseList = ‘0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ‘
# 10进制转62进制
def changeBase(n,b):
    # 返回一个包含商和余数的元组(n // b, n % b)
    x,y = divmod(n,b)
    print(x,y)
    if x>0:
        return changeBase(x,b) + baseList[y]
    else:
        return baseList[y]
# 利用mysql数据库的自增id生成n,然后转成62进制,再将62进制应对的长url存进mysql,下次访问时查询62进制的短url对应的长url,
# 最后重定向301到长url上

def index(request):
    if request.method=="GET":
        return render(request, "index.html")

def url(request,url):
    if request.method=="GET":
        res = models.ShortUrl.objects.filter(short_url=url).first()
        if not res or not res.ori_url:
            return HttpResponse("没有此短网址")
        if time.time()-int(time.mktime(res.period.timetuple()))>0:
            return HttpResponse("短网址已失效")
        return redirect(res.ori_url)
    if request.method=="POST":
        return HttpResponse("Request error")

def addShortUrl(request):
    if request.is_ajax():
        response = {"status": 100, "msg": None}
        long = request.POST.get(‘long‘)
        period = request.POST.get(‘period‘)
        print(long,period)
        res=re.search("^(http|https|ftp)\://([a-zA-Z0-9\.\-]+(\:[a-zA-Z0-9\.&%\$\-]+)*@)?"
                      "((25[0-5]|2[0-4][0-9]|[0-1]{1}[0-9]{2}|[1-9]{1}[0-9]{1}|[1-9])\."
                      "(25[0-5]|2[0-4][0-9]|[0-1]{1}[0-9]{2}|[1-9]{1}[0-9]{1}|[1-9]|0)\."
                      "(25[0-5]|2[0-4][0-9]|[0-1]{1}[0-9]{2}|[1-9]{1}[0-9]{1}|[1-9]|0)\."
                      "(25[0-5]|2[0-4][0-9]|[0-1]{1}[0-9]{2}|[1-9]{1}[0-9]{1}|[0-9])|"
                      "([a-zA-Z0-9\-]+\.)*[a-zA-Z0-9\-]+\.[a-zA-Z]{2,4})(\:[0-9]+)?"
                      "(/[^/][a-zA-Z0-9\.\,\?\‘\\/\+&%\$#\=~_\[email protected]]*)*$",long)
        if not res:
            response["msg"]="网址错误"
            response["status"]=101
        elif period !="一年期" and period !="长期":
            response["msg"] = "有效期格式错误"
            response["status"] = 102
        else:
            date=datetime.datetime.now()
            if period=="一年期":
                date = datetime.datetime.now() + datetime.timedelta(days=365)
            if period=="长期":
                date = datetime.datetime.now() + datetime.timedelta(days=365*5)
            res = models.ShortUrl.objects.create(period=date)
            print(res.id)
            n=res.id
            short_url=changeBase(n,62)
            if short_url=="admin" or short_url=="addShortUrl" or short_url=="restoreUrl":
                response["msg"] = "请求再转换一次试试"
                response["status"] = 103
            else:
                models.ShortUrl.objects.filter(id=n).update(short_url=short_url,ori_url=long)
                response["msg"] = short_url

        return JsonResponse(response)
    if request.method == "GET":
        return HttpResponse("No get method")

def restoreUrl(request):
    if request.is_ajax():
        response = {"status": 100, "msg": None}
        short = request.POST.get(‘short‘)
        res = re.search("^(http|https|ftp)\://([a-zA-Z0-9\.\-]+(\:[a-zA-Z0-9\.&%\$\-]+)*@)?"
                        "((25[0-5]|2[0-4][0-9]|[0-1]{1}[0-9]{2}|[1-9]{1}[0-9]{1}|[1-9])\."
                        "(25[0-5]|2[0-4][0-9]|[0-1]{1}[0-9]{2}|[1-9]{1}[0-9]{1}|[1-9]|0)\."
                        "(25[0-5]|2[0-4][0-9]|[0-1]{1}[0-9]{2}|[1-9]{1}[0-9]{1}|[1-9]|0)\."
                        "(25[0-5]|2[0-4][0-9]|[0-1]{1}[0-9]{2}|[1-9]{1}[0-9]{1}|[0-9])|"
                        "([a-zA-Z0-9\-]+\.)*[a-zA-Z0-9\-]+\.[a-zA-Z]{2,4})(\:[0-9]+)?"
                        "(/[^/][a-zA-Z0-9\.\,\?\‘\\/\+&%\$#\=~_\[email protected]]*)*$", short)
        if not res or "/" not in short:
            response["msg"] = "网址错误"
            response["status"] = 101

        else:
            short_url=short.split("/")[-1]
            res=models.ShortUrl.objects.filter(short_url=short_url).first()
            print(res)
            if not res:
                response["msg"] = "没有该短网址"
                response["status"] = 102
            else:
                response["msg"] = res.ori_url

        return JsonResponse(response)
#模板部分

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <link rel="stylesheet" href="/static/bootstrap-3.3.7-dist/css/bootstrap.css">
    <title>短url</title>
</head>
<body>

<div class="row">
    <div class="col-md-6 col-md-offset-3">
        <form action="" method="post" id="form">
            {% csrf_token %}
            <h1 style="text-align: center">短url</h1>
            <hr>

            <div class="span12">
                <div class="tabbable" id="tabs-149852">
                    <ul class="nav nav-tabs">
                        <li class="active">
                            <a href="#panel-24341" data-toggle="tab">缩短网址</a>
                        </li>
                        <li>
                            <a href="#panel-186783" data-toggle="tab">还原网址</a>
                        </li>
                    </ul>
                    <div class="tab-content">
                        <div class="tab-pane active" id="panel-24341">
                            <br>
                            <div class="form-group">
                                <label for="long" class="sr-only">缩短网址</label>
                                <input type="text" class="form-control" id="long"
                                       placeholder="缩短网址">
                                <br>
                                <button type="button" class="btn btn-primary" id="but_add">缩短网址</button>
                            </div>

                            <div class="form-inline">
                                <p class="form-control-static">有效期:</p>
                                <select class="form-control" id="period">
                                    <option value="一年期">一年期</option>
                                    <option value="长期">长期</option>
                                </select>
                            </div>
                        </div>
                        <div class="tab-pane" id="panel-186783">
                            <br>
                            <form class="form-inline">
                                <label for="short" class="sr-only">还原网址</label>
                                <input type="text" class="form-control" id="short"
                                       placeholder="还原网址">
                                <br>
                                <button type="button" class="btn btn-primary" id="but_restore">还原网址</button>

                            </form>
                        </div>
                    </div>
                </div>
            </div>

        </form>
    </div>
</div>
</body>
<script src="/static/js/jquery-3.3.1.js"></script>
<script src="/static/bootstrap-3.3.7-dist/js/bootstrap.js"></script>

<script>
    $("#but_add").click(function () {

        var formdata={"long":$("#long").val(),"period":$("#period").val(),"csrfmiddlewaretoken":"{{ csrf_token }}"}
        console.log(formdata);

        $.ajax({
            url: "/addShortUrl/",
            type: "post",
            data: formdata,
            success: function (data) {
                if (data.status == 100) {
                    var  a = document.createElement(‘a‘);
                    a.href = location.href+data.msg;
                    alert(a)
                } else {
                    alert(data.msg);
                }
            }

        })
    });
    $("#but_restore").click(function () {

        var formdata={"short":$("#short").val(),"csrfmiddlewaretoken":"{{ csrf_token }}"};
        console.log(formdata);

        $.ajax({
            url: "/restoreUrl/",
            type: "post",
            data: formdata,
            success: function (data) {
                if (data.status == 100) {
                    alert(data.msg);
                } else {
                    alert(data.msg);
                }
            }

        })
    })
</script>
</html>

原文地址:https://www.cnblogs.com/angelyan/p/11830802.html

时间: 2024-07-31 11:44:22

django简单实现短url的相关文章

django简单用户登陆验证

一.django简单用户登陆验证   前端页面:     <div class="container  col-lg-6  col-lg-offset-4">         <br><br><br><br><br>       <form class="form-signin col-sm-4 col-lg-offset-2" action="{% url 'login' %}

Django——如何处理请求(URL配置和视图)

URLconfig—— 为了绑定视图函数和URL,我们使用URLconf. URLconf 就像是 Django 所支撑网站的目录. 它的本质是 URL 模式以及要为该 URL 模式调用的视图函数之间的映射表. 你就是以这种方式告诉 Django,对于这个 URL 调用这段代码,对于那个 URL 调用那段代码. 例如,当用户访问/foo/时,调用视图函数foo_view(),这个视图函数存在于Python模块文件view.py中. 当访问 URL /hello/ 时,Django 根据 ROOT

Django入门(五) &nbsp; 多级URL和默认URL

django中我们发布app01应用的使用的index.html,首先需要在myjango子目录的urls文件中去编辑url的路由     这种情况适用于应用较少的时候.加入我们不只有app01,后面还有很多很多app的时候.如果将这些路由都写入到子目录mudjango目录下的url就显得非常混乱了.这时使用多级url就是一个比较好的解决方案. 首先再创建一个名字叫app02的应用 在命令行下输入 python manager.py startapp app02 第二步.在template目录下

Go实现短url项目

首先说一下这种业务的应用场景: 把一个长url转换为一个短url网址 主要用于微博,二维码,等有字数限制的场景 主要实现的功能分析: 把长url的地址转换为短url地址 通过短url获取对应的原始长url地址 相同长url地址是否需要同样的短url地址 这里实现的是一个api服务 数据库设计 数据库的设计其实也没有非常复杂,如图所示: 这里有个设置需要主要就是关于数据库表中id的设计,需要设置为自增的并且这里有个问题需要提前知道,我们的思路是根据id的值会转换为62进制关于进制转换的代码为: /

Django基础二之URL路由系统

一 URL配置 Django 1.11版本 URLConf官方文档 URL配置(URLconf)就像Django 所支撑网站的目录.它的本质是URL与要为该URL调用的视图函数之间的映射表.你就是以这种方式告诉Django,对于这个URL调用这段代码,对于那个URL调用那段代码. 基本格式  from django.conf.urls import url #循环urlpatterns,找到对应的函数执行,匹配上一个路径就找到对应的函数执行,就不再往下循环了,并给函数传一个参数request,和

02.Django基础二之URL路由系统

一 URL配置 Django 1.11版本 URLConf官方文档 URL配置(URLconf)就像Django 所支撑网站的目录.它的本质是URL与要为该URL调用的视图函数之间的映射表.你就是以这种方式告诉Django,对于这个URL调用这段代码,对于那个URL调用那段代码. 基本格式 from django.conf.urls import url #循环urlpatterns,找到对应的函数执行,匹配上一个路径就找到对应的函数执行,就不再往下循环了,并给函数传一个参数request,和w

Django简单应用的实现

Django简单应用的实现 目录介绍: db.sqlite3:split数据库 manage.py:Django工程启动文件:项目管理器:与项目进行交互的命令行工具集的入口 MyFirstDjango asgi.py: 与ASGI兼容的web服务器为您的项目提供服务的入口点. settings.py: 项目的总配置文件 里面包含了数据库.Web应用.时间等各种配置 urls.py: url配置文件 Django项目中所有地址(页面)都需要我们自己去配置其URL views.py 处理用户发出的请

Django:视图和URL配置

一.视图 1.在mysite文件夹下.创建views.py文件(文件名称没有特别的要求): from django.http import HttpResponse def hello(request): return HttpResponse("Hello world") 2.改动mysite文件夹下的urls.py文件: from django.conf.urls import url from django.contrib import admin from mysite.vie

Django入门(六) &nbsp; 动态URL

多级url虽然可以在多个app的时候将各个应用进行归类.现在有这么一种情况,就是app01里面的views.py里面定义了大量的函数.这样的话我们势必要在app01的urls.py里也要根据函数的数量编辑绑定信息.一个函数一条绑定的信息的对应写下去.为了避免这种可怕的事情,我们就需要使用动态url来处理这种请求.所谓的动态url就是可以通过正则表达式匹配用户输入的url内容,将url当做参数传递给后端的python函数进行处理. 首先我们在app01应用的views.py文件里新建一个函数dyn