Как мне хэшировать маршрут в Python Flask? - PullRequest
0 голосов
/ 23 сентября 2018

Моя цель довольно проста, я создал маршрут, который получает 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()

Я не хочу, чтобы этот идентификатор показывался конечному пользователю.Как мне хешировать маршрут или частично хешировать маршрут?

current url screenshot

Этот маршрут получит переменную с именем PID, как вы можете видеть, эту переменную PID можно рассматривать как идентификатор.Не чувствительно к регистру, но было бы неправильно показывать в URL браузера.

Я попытался использовать hashlib без особого успеха.

1 Ответ

0 голосов
/ 05 марта 2019

Вы можете использовать библиотеку hashids для кодирования и декодирования целочисленных идентификаторов.Во-первых, 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

Затем создайте глобальную переменную среды, чтобы вы могли вызывать функцию create_hashid из шаблона jinja2:

# 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
)

Источник: Эта статья была источником для этих инструкций.

...