python实战: 短链接生成器
项目结构:
error.html用于显示错误
index.html为主页
application.py为服务器
data.json用于保存短链接信息
参考https://blog.csdn.net/qq_36538012/article/details/82884360
error.html
<!DOCTYPE html>
<html lang="en">
<head>
<title>短链接生成器-错误</title>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.4.1/css/bootstrap.min.css">
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script>
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.4.1/js/bootstrap.min.js"></script>
<link rel="shortcut icon" href="https://www.easyicon.net/api/resizeApi.php?id=1207033&size=128">
</head>
<body>
<div class="jumbotron text-center">
<h1>短链接生成器</h1>
<p>短链接</p>
</div>
<div class="container">
<h3>{{info}}</h3>
<br>
<a href="/index">回到主页</a>
</div>
</body>
</html>
index.html
<!DOCTYPE html>
<html lang="en">
<head>
<title>短链接生成器</title>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.4.1/css/bootstrap.min.css">
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.4.1/js/bootstrap.min.js"></script>
<link rel="shortcut icon" href="https://www.easyicon.net/api/resizeApi.php?id=1207033&size=128">
</head>
<body>
<!-- 右键禁用 -->
<script>
function disableRightClick(e)
{
if(!document.rightClickDisabled) // initialize
{
if(document.layers)
{
document.captureEvents(Event.MOUSEDOWN);
document.onmousedown = disableRightClick;
}
else document.oncontextmenu = disableRightClick;
return document.rightClickDisabled = true;
}
if(document.layers || (document.getElementById && !document.all))
{
if (e.which==2||e.which==3)
{
return false;
}
}
else
{
return false;
}
}
disableRightClick();
</script>
<div class="jumbotron text-center">
<h1>短链接生成器</h1>
<p>短链接</p>
</div>
<!-- 禁用F12 -->
<script>
/*document.oncontextmenu = function(){return false;}*/
document.onkeydown=function (e){
var currKey=0,evt=e||window.event;
currKey=evt.keyCode||evt.which||evt.charCode;
if (currKey == 123) {
window.event.cancelBubble = true;
window.event.returnValue = false;
}
}
</script>
<div class="container">
<form action="/index" method="post">
<div class="form-group">
<label>请把你的长链接复制到这里:</label>
<input type="text" name="long" class="form-control">
</div>
<button type="submit" class="btn btn-primary" name="okay">生成</button>
</form>
<!-- 显示短链接 -->
{% if submit %}
<h5>生成的短链接: </h5>
<a href="{{result}}" target="_blank">{{result}}</a>
{% endif %}
</div>
application.py
import json
import flask
import random
import string
app = flask.Flask(__name__)
@app.route('/urls/<code>')
def redirect(code):
with open('data.json', 'r', encoding='utf-8') as f:
data = json.loads(f.read())
url = data.get(code)
if url:
return flask.redirect(url)
return flask.render_template('error.html', info='访问的短链接不存在!')
@app.route('/index', methods=['GET', 'POST'])
def index():
if flask.request.method == 'GET':
return flask.render_template('index.html', submit=False, result='')
else:
chars = string.ascii_letters + string.digits
with open('data.json', 'r', encoding='utf-8') as f:
data = json.loads(f.read())
code = ''.join(random.sample(chars, 4))
while code in data:
code = ''.join(random.sample(chars, 4))
short = f'localhost:65032/urls/{code}'
long = flask.request.form.get('long')
data[code] = long
with open('data.json', 'w', encoding='utf-8') as f:
f.write(json.dumps(data))
return flask.render_template('index.html', submit=True, result=short)
app.run(host='localhost', port=65032, debug=True)
data.json
{}