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\.\,\?\'\\/\+&%\$#\=~_\-@]*)*$",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\.\,\?\'\\/\+&%\$#\=~_\-@]*)*$", 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>
三、效果图

django简单实现短url的更多相关文章
- Django和Flask对于URL尾斜杠(back slash)的处理
最近在看Flask,其中提到了对于URL尾斜杠的处理.感觉算是一个需要注意的地方吧,就和Django的处理方式来进行一个简单的对比. 首先说下什么是尾斜杠. http://www.baidu.com/ ...
- 循序渐进Python3(十二) --2-- web框架之django简单实现oracle数据库操作
在 Django 中构建 Oracle 数据库支持的 Web 应用程序 了解如何配置 Django 以便与 Oracle 数据库交互,并使用 ORM 进行数据库连接. 产能在软 ...
- 【django基础补充之URL,视图,模版】
一.url路由配置 URL配置(URLconf)就像Django 所支撑网站的目录.它的本质是URL与要为该URL调用的视图函数之间的映射表:你就是以这种方式告诉Django,对于这个URL调用这段代 ...
- Go实现短url项目
首先说一下这种业务的应用场景: 把一个长url转换为一个短url网址 主要用于微博,二维码,等有字数限制的场景 主要实现的功能分析: 把长url的地址转换为短url地址 通过短url获取对应的原始长u ...
- 通过Beego将之前实现的短url项目实现
正好通过这个小例子对之前了解的beego框架的基本内容进行一个简单的应用 实现的完整代码地址:https://github.com/pythonsite/go_simple_code/tree/mas ...
- 短URL
短网址应用已经在全国各大微博上开始流行了起来.例如QQ微博的url.cn,新郎的sinaurl.cn等. 我们在QQ微博上发布网址的时候,微博会自动判别网址,并将其转换,例如:http://url.c ...
- Django基础二之URL路由系统
一 URL配置 Django 1.11版本 URLConf官方文档 URL配置(URLconf)就像Django 所支撑网站的目录.它的本质是URL与要为该URL调用的视图函数之间的映射表.你就是以这 ...
- Django基于正则表达式的URL(1)
1. 此时,用户只能看到列表,如果用户想查看详细信息,应该再增加程序. 2. 把信息用a标签包起来以后,详细信息就有了可以跳转的功能. . 3. 点击不同的用户名时,获取到不同的信息. 3.1 在ur ...
- DJango简单的后台定义登录验证
第一步创建一个新的项目 APPLICATIONNAME : 表示创建子项目 第二步:找到主项目的url 进行 include 分发式url 简单的说,就是将app里边的url放在这里. 这里也可以找到 ...
随机推荐
- 安卓8.0真机运行appium1.4遇到的问题:运行自动化脚本,手机自动安装 settings.apk和unclock.apk,执行脚本时提示安装UnicodeIME-debug.apk失败,怎么关掉自动安装?
运行自动化脚本,手机自动安装 settings.apk和unclock.apk,执行脚本时提示安装UnicodeIME-debug.apk失败,怎么关掉自动安装? 这3个apk的目录分别是: D:\P ...
- poj 2752 kmp的next数组
题目大意: 求一个字符串中某一个既是前缀又是后缀的前缀的结尾下标: 基本思路: 从_next[len]开始找_next[_next[len]],再找_next[_next[_next[len]]],一 ...
- PHP FILTER_VALIDATE_EMAIL 过滤器
定义和用法 FILTER_VALIDATE_EMAIL 过滤器把值作为 e-mail 地址来验证. Name: "validate_email" ID-number: 274 实例 ...
- 设置select下拉框高度的一种方法
这种方法可以设置下拉框最多显示几条栏目,多余的栏目用显示滚动条展示: <select style="position: absolute;z-index: 1;" onmou ...
- (转)OS: 生产者消费者问题(多进程+共享内存+信号量)
转:http://blog.csdn.net/yaozhiyi/article/details/7561759 一. 引子 时隔一年再次用到 cout 的时候,哥潸然泪下,这是一种久别重逢的感动,虽然 ...
- php开发面试题---Linux常用命令大全
php开发面试题---Linux常用命令大全 一.总结 一句话总结: ls 查看目录中的文件 cd .. 返回上一级目录 cat 查看文件内容 touch 新建文件或修改时间 1.linux 系统信息 ...
- 剑指offer——43数据流中的中位数
题目描述 如何得到一个数据流中的中位数?如果从数据流中读出奇数个数值,那么中位数就是所有数值排序之后位于中间的数值.如果从数据流中读出偶数个数值,那么中位数就是所有数值排序之后中间两个数的平均值.我们 ...
- C语言——二维数组
目录 二维数组 一.二维数组的定义 二.二维数组的初始化 三.通过赋初值定义二维数组的大小 四.二维数组与指针 二维数组 一.二维数组的定义 类型名 数组名[ 常量表达式1 ][ 常量表达式2 ] i ...
- JasperReport环境设置
JasperReport是一个纯Java库,而不是一个独立的应用程序.它不能单独运行,因此它需要被嵌入到另一个客户端或服务器端的Java应用程序.因为它是基于Java,它可以在任何支持Java的平台( ...
- HTML5 placeholder实际应用经验分享及拓展
QQ邮箱登陆(http://mail.qq.com) 如下截图啦: 我在上面一个demo类似原理上做了下修改,制作了一个这样子交互效果的demo,希望对有兴趣的同行能帮上点忙,您可以狠狠地点击这里:透 ...