大家好,這是皮爺給大家帶來的最新的學習Python能幹啥?之Django教程,從零開始,到最後成功部署上線的項目。這一節,我們來完善我們的Dashboard功能展示頁面。
Peekpa.com的官方地址:http://peekpa.com
皮爺的每一篇文章,都配置相對應的代碼。這篇文章的代碼Tag是Post_026
上一節,我們利用了request.session開發了只有輸入密碼才能訪問的頁面,這個,你懂得。那麼這一節,我們就來研發一下如何把我們的CMS Dashboard給別人展示。並且,他再CMS裏面一番狂操作之後,我們的數據庫數據並不會改變。
創建User
我們之前的CMS裏面是沒有User視圖函數的,所以,這裏我們就參照之前管理工具的開發,我們先得把User的添加界面開發出來。這裏就不做過多解釋,因爲重點都在之前的文章很詳細的講述了,所以,這裏,我們就開發好user的publish頁面之後,再給添加一個User:
可以看到,我們新添加的User的Email是[email protected]
,密碼還是之前的12341234
。
限制展示
首先來分析一下,我們限制展示的內容,這裏主要就是左側的Code還有User,因爲這兩個板塊,會涉及到一些網站的隱私,所以我們這裏屏蔽掉。意思就是,如果是管理員登錄,那麼我們就展示;如果不是管理員,自然而然你是看不到這兩個板塊的。
接下來,我們首先要做的就是限制展示。
限制展示這塊,有兩部分:一是在UI上面不給展示;第二部分則是直接輸入URL也不給展示。
那麼第一部分,在UI層面不給展示,這個簡單。我們只需要修改cms/base/sidebar.html
裏面的文件即可,給這兩個板塊,添加個if判斷就可以:{% if request.user.is_superuser %}xxxxxx{% endif %}
:
{% if request.user.is_superuser %}
{% url 'cms:code_manage_view' as code_manage_view %}
{% url 'cms:code_publish_view' as code_publish_view %}
<li class="nav-item has-treeview {% if request.path == code_manage_view or request.path == code_publish_view %}menu-open{% endif %}">
<a href="#" class="nav-link {% if request.path == code_manage_view or request.path == code_publish_view %}active{% endif %}">
<i class="nav-icon fas fa-code"></i>
<p>
Code
<i class="right fas fa-angle-left"></i>
</p>
</a>
<ul class="nav nav-treeview">
<li class="nav-item">
<a href="{% url 'cms:code_manage_view' %}" class="nav-link {% if request.path == code_manage_view %}active{% endif %}">
<i class="far fa-circle nav-icon"></i>
<p>Management</p>
</a>
</li>
<li class="nav-item">
<a href="{% url 'cms:code_publish_view' %}" class="nav-link {% if request.path == code_publish_view %}active{% endif %}">
<i class="far fa-circle nav-icon"></i>
<p>Publish</p>
</a>
</li>
</ul>
</li>
{% endif %}
這樣做了之後,我們再用Peekpa的賬號登錄,就會發現左側的Sidebar裏面他們不見了:
但是,如果我們輸入code manage的網址http://127.0.0.1:8000/cms/dashboard/code/manage
,這個頁面還是會出來的:
這是因爲,我們對於Django的視圖函數還沒有修改,所以,這裏我們準備使用修飾器的方式來做處理。
在peekpauser/decorators.py
修飾器文件下,編寫一個peekpa_login_superuser
函數,用來判斷用戶是否是超級管理員的邏輯:
def peekpa_login_superuser(func):
def wrapper(request, *args, **kwargs):
if request.user.is_superuser:
return func(request, *args, **kwargs)
else:
if request.is_ajax():
return restful.unauth(message='請先登錄!')
else:
return redirect(reverse('cms:login'))
return wrapper
接下來,我們就要在cms/views.py
下面的視圖函數了,來修飾Code和User的view,注意,視圖函數還有視圖類都要修飾:
@peekpa_login_required
@peekpa_login_superuser
def code_manage_view(request):
@peekpa_login_required
@peekpa_login_superuser
def code_publish_view(request):
@method_decorator(peekpa_login_required, name='post')
@method_decorator(peekpa_login_superuser, name='post')
class CodeView(View):
@method_decorator(peekpa_login_required, name='get')
@method_decorator(peekpa_login_superuser, name='get')
class CodeEditView(View):
@method_decorator(peekpa_login_required, name='post')
@method_decorator(peekpa_login_superuser, name='post')
class CodeDeleteView(View):
此時,我們再打開http://127.0.0.1:8000/cms/dashboard/code/manage
頁面來看一下:
發現右下角,系統自動已經幫我們重定向到了登錄頁面,說明這個只給管理員展示內容的功能已經完成了。
屏蔽操作
到目前爲止,如果用戶不是超級管理員,那麼他是看不到一些特殊頁面的,包括輸入url。而其他內容都可以看到。接下來,是最重要的一步,就是如果用戶不是超級管理員,他是無法對數據操作的,只能查看,提交了修改並不會生效。
這個的實現思路,其實很簡單,只需要在每一次數據在提交給數據的時候(主要是新建
和修改
兩種),通過``來判斷一下就好:
@method_decorator(peekpa_login_required, name='post')
class CategoryView(View):
def post(self, request):
# 新建提交
if 'submit' in request.POST:
form = CategoryForm(request.POST)
if form.is_valid():
name = form.cleaned_data.get('name')
# 判斷用戶是否是超級管理員,如果是,則會提交,否則直接返回
if request.user.is_superuser:
Category.objects.create(name=name)
return redirect(reverse("cms:category_publish_view"))
else:
return restful.method_error("Form is error", form.get_errors())
將所有的板塊裏面的數據提交還有修改的方法前面加上對用戶身份的判斷邏輯,這樣就完成了。
之後當系統搭建好之後,只要添加一個示例賬號,就可以讓別人通過這個賬號的登錄你的系統,看到你的系統的管理臺,但是別人的任何操作都無法修改你的數據,很完美。
技術總結
最後總結一下,
功能展示的開發:
- 功能展示,就是要讓示例賬戶只能讀取,不能修改;
- 所以首先要添加User,添加一個特定的賬戶,用來做示例賬戶;
- 接下來就是屏蔽頁面,屏蔽分兩步,第一步是屏蔽頁面的入口,第二就是屏蔽URL對應的映射函數;
- 若是想屏蔽數據修改的功能,就在數據修改之前,來判斷用戶是否有資格操作,如果沒有資格,則跳過;
- 完畢。
獲取代碼的唯一途徑:關注『皮爺擼碼』,回覆『代碼』即可獲得。
長按下圖二維碼關注,如文章對你有啓發,歡迎在看與轉發。