image memes.tw
延續前幾篇的想法下,又多冒出了一些新的點子!
而最新的點子好像才有辦法解決掉我一開始的煩惱。
一開始的目標是我要我的view是乾淨的、舒服的,於是我把一些相關的判斷或對資料庫的處理額外拉了類別出來,就前幾篇來說會是Member類別有login這個方法,然而這樣我的view裡面依舊有一些基本的判斷,例如:判斷request的method、拿取前端拋回來的資料⋯⋯依舊會讓我的view乘載過多的資訊,導致頁面一多看起來就亂亂的,於是參考了 水球軟體學院 社群夥伴的想法,我終於打造出一版我目前滿意的寫法,大致順序如下:
- 把原本view裡面的資訊包成一個Service類別
- 在Service類別中處理原來會跟Member類別的行為
- 大功告成
#views.py
def login(request):
return LoginService(request)
這樣變得非常的乾淨呢!!再來只要把LoginService做好~
class LoginService:
def __init__(self, request):
self.request = request
def login(self):
if self.request.method == "GET":
ctx = {}
return render(self.request, "會員登入.html", ctx)
if self.request.method == "POST":
data = {}
會員帳號 = self.request.POST.get("會員帳號", "")
會員密碼 = self.request.POST.get("會員密碼", "")
member = 會員()
if member.login(會員帳號, 會員密碼):
data['message'] = "密碼正確!!"
else:
data['message'] = "噗噗!!帳號密碼有誤~"
return JsonResponse(data)
完美!!這樣就可以很完美的把我的view變乾淨。
但今天歹擠謀假甘單(事情沒有那麼簡單),我的網站不只有member這個角色,還有store這個角色呢~照這樣看來我不就又要開一個view又要開一個LoginService呢??(當然view要開因為不同頁面),於是我突發奇想蹦出了這個作法:
直接把store類別 / 物件直接當作參數丟進去!!
def login(request):
return LoginService(request, Store()).login()
def login(request):
return LoginService(request, Member()).login()
class LoginService:
def __init__(self, request, user):
self.request = request
self.user = user
def login(self):
if self.request.method == "GET":
ctx = {}
return render(self.request, "會員登入.html", ctx)
if self.request.method == "POST":
data = {}
會員帳號 = self.request.POST.get("會員帳號", "")
會員密碼 = self.request.POST.get("會員密碼", "")
#這裡就直接修改掉!!
if self.user.login(會員帳號, 會員密碼):
data['message'] = "密碼正確!!"
else:
data['message'] = "噗噗!!帳號密碼有誤~"
return JsonResponse(data)
可喜可賀!!這樣我的LoginService就可以同時給member和store使用了,假設未來又多了新的角色我也可以直接使用LoginService(除非他今天登入不用帳號密碼了),於是乎我就這樣開心的繼續寫著程式~~
心得:很感謝社群的夥伴願意分享想法,不然我自己一個人要想出這些東西可能還要花上好一段時間,我也相信我這個一定不是最佳解答,但至少以現在來說我可以繼續開心的寫程式,而不會有一個疙瘩黏在那邊,如果你有更好的想法也歡迎一起交流交流~~