如何在Python Flask中对路由进行哈希处理?

时间:2018-09-22 23:47:27

标签: python flask hash routes flask-sqlalchemy

我的目标非常简单,我创建了一个接收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显示给最终用户。如何哈希路由或部分哈希路由?

current url screenshot

如您所见,此路由将接收一个名为PID的变量,该PID变量可以视为ID。不区分大小写,但是不能在浏览器URL上显示。

我尝试使用hashlib并没有成功。

1 个答案:

答案 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是这些说明的来源。