抱歉,你查看的文章不存在

利用Python打造短链服务(一)

一、越来越长的网址与短链服务

互联网发展愈快,功能越多,有些网址也越来越长,如果仅仅是浏览还好,涉及到传播,一大串的网址分发容易出错也不易推广。

而且,有些互联网巨头严防死守竞争对手的的链接出现在自家的产品里,用尽一切手段限制竞争对手的网址链接在自家产品上被顺利打开引流。

处于便于传播、不影响页面美观或者是绕过屏蔽的目的,网址缩短服务应运而生。

目前国内有很多家网站提供网站缩短服务,比如腾讯家的t.im、微博家的t.cn、百度家的dwz.cn等,有一些只是提供简单的网址缩短服务,有一些则在网址缩短服务的基础上还增加了访客统计的功能,对一些推广链接来说,很有用。

短链的实现方式很简单,我们可以使用Python轻松地构建一个短链服务出来。

二、构建短链服务

网址缩短与短链生成的方式,一般有两种。 一种是用哈希算法,一种则是生成随机字符串与原网址的对应存储在数据库中。 在此,我们使用后一种方法。

短链服务终究是一个Web服务,我们需要一个Web框架。

Python中有很多优秀的Web框架,比如Flask、Django、Tornado……

每个框架都有各自的特色和优点,每个框架也有各自的拥趸者。在此,我们选用Django,原因无他,使用熟悉而已。

1、创建一个虚拟环境

为了与本机原有的Python环境相隔离,我们使用virtualenv创建一个隔离的虚拟Python环境。

2、安装Django

使用active命令进入虚拟环境中,安装所需要的Django库。

3、创建Django项目和应用

使用django-admin工具创建一个项目(project)dwz和一个应用(app)shortener

我们启动项目,看看是否正确

启动项目

嗯,启动正常的

接下来,我们创建一个用于保存原网址和随机字符串的数据库模型

4、分析和创建数据库模型

因为我们选用的是随机字符串匹配原始网址的网址缩短方案,所以,我们需要使用数据库将生成的随机字符串和原始网址一一对应保存在一张数据表中。

分析一下,这张数据表里面,一共有些什么字段:

  • 随机字符串:对应于原始网址的缩短码;
  • 原始网址URL
  • 创建时间:方便进行记录统计
  • 活动状态:方便短链管理

那么,我们就需要在Django中创建一张有四个字段的数据模型。

在models.py文件中创建一个DwzURL模型:

将应用添加到setting.py的INSTALLED_APPS 中:

生成模型:

完成之后,运行项目,去后台看看。 先创建一个超级用户:

登录后台:

发现并没有我们创建的模型,原来是admin.py中忘记添加了:

我们在admin.py中把模型添加进去。对了,英文界面看着不适应,顺便去setting.py文件中把语言改成中文。

在admin.py中添加模型:

修改网址语言为中文:

我们再去后台看看:

嗯,已经出现我们新建的模型,而且网站语言从英文变成了中文。

我们新建一个记录看看,就拿之前的淘宝活动链接吧:

嗯,后台上也出现了我们新建的记录:

对应关系是建立了,但是这是手动的,我们需要的是输入一个长网址,就生成一个缩短码。

5、优化模型方法

嗯,我们创建一个生成缩短码的函数,再重写DwzURL模型的save()方法,让其在输入一个URL的时候自动生成一个缩短码。

创建缩短码生成函数,从英文字母和数字中随机生成一个6位数的字符串:

重写DwzURL模型的save()方法,让其在保存的时候自动调用缩短码生成函数生成一个缩短码:

我们来测试一下,新增一个记录,只输入网址URL:

结果是按照我们的设想顺利生成了一个缩短码:

这样就达到了我们期望的只输入网址,自动随机生成一个缩短码的效果。

6、创建视图

Django是典型的MVC模式的Web框架,模型(models)负责数据记录、视图(views)负责业务逻辑、路由(urls)负责业务逻辑对应的页面路径,最后模板(templates)负责页面渲染。

我们已经构建好了模型,接下来我们来写网址缩短的业务逻辑(视图)。

目前我们整个服务的逻辑很简单:

  • 三个功能:首页展示、缩短码生成、短链跳转
  • 两个视图:首页(GET方法呈现首页)及短码生成视图(POST方法生成缩短码)、短链跳转视图

开干!

首先是首页第一个视图: 创建一个基于类的视图,创建一个get方法,用于呈现首页HTML;创建一个post方法,接收表单传递的网址并生成缩短码及返回:

创建第二个短链跳转视图,获取缩短码进行从数据库中进行对比,如果存在则重定向至原网址,如果不存在则返回404:

视图创建好了,接下来设置路由。

7、设置路由

按照我们写的视图,我们需要新增两个路由:

  • 首页
  • 跳转

在urls.py的urlpatterns列表中新增两条路由,分别对应两个视图:

路由也设置好了,对了,我们还缺了HTML模板。去网上搜索一个搜索框的模板: 嗯,就它了!

创建一个模板目录templates,在settings.py中设置模板路径:

创建一个static目录,在settings文件中设置静态文件路径:

8、测试

由于是在本地做测试,我们需要修改一下本机的hosts文件,将一个短域名映射到127.0.0.1上,如果是部署在服务器上的,就直接绑定域名和部署。

将g.me映射到本地端口:

打开首页看看:

我们输入一个长的网址看看(gif动图):

嗯,这样,一个具备基本功能的短链服务就已经使用Python构造好了。

下一步,我们可以做些什么?

  • 构造一个API服务,批量生成短链
  • 新建一个应用,对短链进行统计分析,类似于CNZZ

嗯,下一步的事情,咱们下一文再见!

原文发布于微信公众号 - 州的先生(zmister2016)

原文发表时间:2017-10-12

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

编辑于

州的先生

4 篇文章54 人订阅

相关文章

来自专栏全栈数据化营销

6款超级提高效率的chrome插件

是一款网页标签插件,我们通常会因为工作需要,去浏览大量的网页,结果是,打开的网页越来越多,又不敢轻易关掉,害怕再也找不回来。 One Tab可以让你把网页瞬间集...

1112
来自专栏开源优测

JMeter监听器10

前言 在jmeter中,通过监听器组件来提供查看、保存、和读取已保存的测试结果功能。 默认情况下,测试结果将被存储为xml格式的文件,文件的后缀: ".jtl"...

3154
来自专栏Golang语言社区

【Go 语言社区】如何实现单服务器300万个长连接的?

不是吹牛,理论上完全可以达到。 (以下参考值皆是Linux平台上) 1,Linux单个进程可以维持的连接数(fd)理论值是通过ulimit -a设置,或在se...

71310
来自专栏Java进阶架构师

「架构技术专题」构建网站高可用架构(详细分析篇)(6)

可用性指标时网站架构设计的重要指标,对外是服务承诺,对内是考核指标,具体到每个工程师,更多的是使用故障分。

783
来自专栏Vamei实验室

协议森林13 9527 (DNS协议)

在周星驰的电影《唐伯虎点秋香》中,周星驰饰演的主角一进入华府,就被强制增加了一个代号9527。从此,华府的人开始称呼主角为9527,而不是他的姓名。 ? 域名(...

21410
来自专栏企鹅号快讯

10 个技巧促使你的 Git 的技能上一个台阶——SitePoint

第一时间关注程序猿(媛)身边的故事 最近,我们发布了一些教程促使你了解 Git 基础知识和在团队环境中使用 Git。谈论的指令已经足够帮助一个开发者在 Git ...

1898
来自专栏区块链

CVE-Python webbrowser.py 命令执行漏洞分析

今日惊闻Python出现了CVE,问题出在Lib/webbrowser.py模块,看描述还十分严重。Python容易产生远程命令执行漏洞。攻击者可以利用此问题,...

2497
来自专栏Crossin的编程教室

【Python 第31课】 读文件

之前,我们写的程序绝大多数都依赖于从命令行输入。假如某个程序需要输入很多数据,比如一次考试的全班学生成绩,再这么输就略显痛苦了。一个常见的办法就是把学生的成绩都...

3497
来自专栏finleyMa

react学习系列4 组件生命周期

组件的生命周期非常重要。官方文档 已经就讲的比较清楚了 找了半天发现下面的图最清晰直观(点击放大):

924
来自专栏杂烩

推荐一个代码生成器 原

    想偷懒,那这个神器首先不能太复杂,鼠标点点,代码就出来了,其次功能要丰富,或者使用灵活,能生成任何语言的代码。

1316

扫码关注云+社区

领取腾讯云代金券