خاطرات فنی من

یادداشتهایی در مورد تجربیات فنی من به عنوان یک مهندس نرم افزار برای مراجعه بعدی خودم و احتمالا دیگران.

سعی می کنم مطالب برای دیگران هم قابل استفاده باشند اما به دلیل کمی وقت نمی توانم زیاد نگران نگارش و چینش متن باشم

اعمال دسترسی و permission وقتی با django و htmx کار می کنید

سه شنبه, ۱۷ مرداد ۱۴۰۲، ۰۶:۳۵ ب.ظ

اگر در قسمت ادمین django یوزر درست کرده باشید دیده اید که می توان برای هر کاربر و هر گروه از کاربران روی هر کلاسی که داخل models تعریف کرده اید دسترسی تعریف کنید: هر کاربر می تواند دسترسی add , delete , change or view روی هر مدل تعریف شده داشته باشد.

یکی از روشهای اعمال دسترسی کاربران به داده ها همین است.

برای این کار در همین قسمت ادمین دسترسی ها را تعریف می کنید.

بعد در views.py ، دسترسی ها را مشخص می کنید: اگر از class-based-views استفاده می کنید باید PermissionRequiredMixin و اگر از function-based-views استفاده می کنید @permission_required را به کار ببرید. 

به عنوان مثال

class RouteListView(PermissionRequiredMixin, ListView):
    permission_required = ["transport.view_route"]
    model = Route

class RouteCreateView(PermissionRequiredMixin, CreateView):
    permission_required = ["transport.add_route"]
    model = Route
    fields = ['source', 'destination', 'date']
    template_name = "transport/route-create.html"
    success_url = reverse_lazy("route-list")

نام مدل من در اینجا route و نام اپلیکیشن من transport بوده است.

 

حالا وقتی کاربری که permission کافی ندارد بخواهد به این view ها دسترسی داشته باشد خطای 403 میگیرد. بطور عادی خود django یک پیام

403 Forbidden

به کاربر نشان می دهد.

البته اگر از htmx استفاده می کنید چنین پیامی را نخواهید دید و پیام خطا فقط در terminal دیده می شود.

کاربر هم در واقع هیچ تغییری در صفحه نمی بیند. چون htmx یک پیام خطای دیگر Raise می کند. اگر بخواهید باید آن را مدیریت کنید.

اما طبیعتا بهتر است شما اصلا لینکهای صفحات و viewهایی که کاربر به آن دسترسی ندارد را به او نشان ندهید نه اینکه لینک را نشان دهید و بعد

پیام خطا بدهید.

برای این کار در template باید از ساختار {% if perms.foo.add_vote %} استفاده کنید.

به عنوان مثال

        {% if perms.trasnport.add_route or perms.trasnport.view_route %}
            <div class="list-group shadow-sm small mb-3">
                <div class="list-group-item active">لیست مسیر ها</div>
                {% if perms.trasnport.add_route %}
                    <a href="#" class="list-group-item list-group-item-action" hx-get="{% url 'route-create' %}" hx-trigger="click"
                        hx-target="#content"  hx-swap="innerHTML" data-bs-target="#surveyCreateModal">ایجاد مسیر</a>
                {% endif %}

                {% if perms.trasnport.view_route %}
                    <a href="#" class="list-group-item list-group-item-action" hx-get="{% url 'route-list'   %}" hx-trigger="click"
                        hx-target="#content" hx-swap="innerHTML" data-bs-target="#surveyCreateModal">لیست مسیرهای</a>
                {% endif %}
            </div>
        {% endif %}
موافقین ۰ مخالفین ۰ ۰۲/۰۵/۱۷

نظرات  (۰)

هیچ نظری هنوز ثبت نشده است

ارسال نظر

ارسال نظر آزاد است، اما اگر قبلا در بیان ثبت نام کرده اید می توانید ابتدا وارد شوید.
شما میتوانید از این تگهای html استفاده کنید:
<b> یا <strong>، <em> یا <i>، <u>، <strike> یا <s>، <sup>، <sub>، <blockquote>، <code>، <pre>، <hr>، <br>، <p>، <a href="" title="">، <span style="">، <div align="">
تجدید کد امنیتی