使用FastAPI和Python构建URL缩短服务
本教程将使用FastAPI和Python构建一个URL缩短服务。该服务将提供三个API端点,用于创建缩短的URL,重定向到原始URL以及获取缩短URL的访问次数。
需求
- 应用程序应允许用户使用包含长URL的键值对的JSON正文向终端节点提交长URL。
- 收到请求后,服务器生成一个最多五个字符的随机字符串,并使用此字符串作为密钥以创建格式的缩短URL:
http://company.com/<key>。 然后,应用程序应在响应正文中返回此缩短的URL,状态代码为201,并返回缩短URL的JSON对象。 - 应用程序应实现重定向功能,在用户访问缩短的URL时,将用户重定向到原始URL。如果缩短的URL不存在,返回404状态码。
- 应用程序应具有一个端点,该端点返回对响应正文中特定缩短URL的访问次数,其中包含访问次数的JSON对象。如果缩短的URL不存在,则应返回0次访问:
/info/<key>。 - 创建新的短URL应该时幂等的:即: 如果多次提交相同长的URL,则应返回相同的短URL。
- 应用程序应拒绝无效的URL。
示例
创建新的短网址:
- 请求:
POST /
{“login_url': “http://a.very.long.long.url/even-loging-path”}
- 响应:
{'show_url': 'http://company.com/abcdef'}
访问短网址:
- 请求:
GET /abcdef
- 响应:
重定向到:
http://a.very.long.long.url/even-loging-path
获取访问次数
- 请求
GET /info/abcdef
- 响应:
{'visits': 1}
代码
import random
import string
import uvicorn
from fastapi import FastAPI, HTTPException
app = FastAPI()
url_mapping = {} # 用于存储长URL和短URL的字典
def generate_random_key():
'''生成随机的5个字符作为短URL的一部分'''
return ''.join(random.choices(string.ascii_lowercase + string.digits, k=5))
@app.post('/')
def post(url_data: dict):
long_url = url_data.get('login_url')
if not long_url:
raise HTTPException(status_code=400, detail='Invalid URL')
if long_url in url_mapping.values():
short_url = next(key for key, value in url_mapping.items() if value == long_url)
else:
characters = generate_random_key()
short_url = ''.join(random.choice(characters) for _ in range(5))
url_mapping[short_url] = long_url
return {'short_url': f'http://company.com/{short_url}'}
@app.get('/{key}')
def get_key(key: str):
if key not in url_mapping:
raise HTTPException(status_code=404, detail='Short URL not found')
return {'redirect_url': url_mapping[key]}
@app.get('/info/{key}')
def get_info(key: str):
visits = 0
if key in url_mapping:
visits = 1
return {'visits': visits}
if __name__ == '__main__':
uvicorn.run(app, host='0.0.0.0', port=8000)
运行程序
- 确保已安装FastAPI和uvicorn。
- 运行以下命令启动应用程序:
python main.py
现在,您可以使用以下URL访问API端点:
- 创建新的短URL:
http://localhost:8000/ - 重定向到原始URL:
http://localhost:8000/<key> - 获取访问次数:
http://localhost:8000/info/<key>
注意
此示例代码仅供演示用途,实际使用时可能需要进行进一步的优化和扩展,例如:
- 添加数据库以存储URL映射关系,以提高可靠性和可扩展性。
- 使用更复杂的随机字符串生成算法,确保生成的短URL更具随机性。
- 添加用户身份验证和授权机制,以控制对API的访问。
- 使用缓存机制,提高响应速度。
原文地址: https://www.cveoy.top/t/topic/qp5z 著作权归作者所有。请勿转载和采集!