我的目标非常简单,我创建了一个接收ID的路由。
@app.route('/afbase/<int:pid>', methods=["GET", "PATCH", "DELETE"])
# We defined the page that will retrieve some info
def show(pid):
new_person = People.query.filter_by(pid=pid).first()
我不希望将此ID显示给最终用户。如何哈希路由或部分哈希路由?
如您所见,此路由将接收一个名为PID的变量,该PID变量可以视为ID。不区分大小写,但是不能在浏览器URL上显示。
我尝试使用hashlib并没有成功。
答案 0 :(得分:1)
您可以使用hashids
库对整数ID进行编码和解码。首先,pip install hashids
。然后,创建一些实用程序功能。
# utils.py
from flask import current_app
from hashids import Hashids
def create_hashid(id):
hashids = Hashids(min_length=5, salt=current_app.config['SECRET_KEY'])
hashid = hashids.encode(id)
return hashid
def decode_hashid(hashid):
hashids = Hashids(min_length=5, salt=current_app.config['SECRET_KEY'])
id = hashids.decode(hashid)
return id
接下来,创建一个全局环境变量,以便您可以从jinja2模板中调用create_hashid函数:
# app.py
from utils import create_hashid
app.jinja_env.globals.update(create_hashid=create_hashid)
以下是从模板中的链接调用该函数的方法:
# index.html
<a href="{{ url_for('invoice.view_invoice', hashid=create_hashid(invoice.id) ) }}">View Invoice</a>
最后,您的视图功能:
# views.py
@blueprint.route('/dashboard/invoice/<hashid>')
@login_required
def view_invoice(hashid):
invoice_id = decode_hashid(hashid)
invoice = Invoice.query.filter_by(
user_id=current_user.id,
id=invoice_id
).first_or_404()
return render_template(
'dashboard/invoice/view_invoice.html',
invoice=invoice
)
来源:this article是这些说明的来源。