>[success] # 數據處理模塊model
~~~
1.save --- 數據保存的方法
2.load --- 數據讀取的方法
3.Model --- 數據存儲的基類 活用__dict__方法
db_path --- 方法用來獲取對應的子類名字數據保存的地址
all --- 方法參考django的all方法
find_all --- django fittler().all()
find_by --- 類似djangofirst 返回第一個值
find --- 根據id查詢
delete --- 刪除
__repr__ --- 簡單來說, 它的作用是得到類的 字符串表達 形式
save --- 用來保存數據
4.User --- 用來處理用戶的類
salted_password --- 密碼加鹽的方法
~~~
>[danger] ##### 代碼
~~~
import json
from utils import log
def save(data, path):
"""
data 是 dict 或者 list
path 是保存文件的路徑
"""
s = json.dumps(data, indent=2, ensure_ascii=False)
with open(path, 'w+', encoding='utf-8') as f:
# log('save', path, s, data)
f.write(s)
# 讀取文件信息
def load(path):
with open(path, 'r', encoding='utf-8') as f:
s = f.read()
# log('load', s)
return json.loads(s)
class Model:
"""
數據存儲的基類
"""
# 獲取儲存地址
@classmethod
def db_path(cls):
"""
那個類使用,獲取那個類的類名,和保存文件一直
"""
classname = cls.__name__
path = 'data/{}.txt'.format(classname)
return path
@classmethod
def all(cls):
path = cls.db_path()
# 讀取文件將字符串轉換成python 對象
models = load(path)
# 參考django orm all方法
ms = [cls(m) for m in models]
return ms
@classmethod
def find_all(cls, **kwargs):
"""
類似 django fittler().all()
:param kwargs:
:return:
"""
ms = []
log('kwargs, ', kwargs, type(kwargs))
k, v ='',''
for key, value in kwargs.items():
k, v =key, value
all = cls.all()
# 得到所有的 對象
for m in all:
# 利用dict的魔方方法獲取對應的k,v ,判斷查詢的對象是否存在
if v == m.__dict__[k]:
ms.append(m)
return ms
@classmethod
def find_by(cls, **kwargs):
"""
用法如下,kwargs 是只有一個元素的 dict
u = User.find_by(username='gua')
類似djangofirst 返回第一個值
"""
log('kwargs, ', kwargs, type(kwargs))
k, v = '', ''
for key, value in kwargs.items():
k, v = key, value
all = cls.all()
for m in all:
# 也可以用 getattr(m, k) 取值
if v == m.__dict__[k]:
return m
return None
@classmethod
def find(cls, id):
"""
只查詢 id
:param id:
:return:
"""
return cls.find_by(id=id)
@classmethod
def delete(cls, id):
"""
刪除 先找到全部,然后刪除指定
"""
models = cls.all()
index = -1
for i,e in enumerate(models):
if e.id == id:
index = i
break
if index == -1:
# 沒找到
pass
else:
models.pop(index)
# 根據init 來保存記錄文件
l = [m.__dict__ for m in models]
path = cls.db_path()
save(l, path)
return
def __repr__(self):
"""
__repr__ 是一個魔法方法
簡單來說, 它的作用是得到類的 字符串表達 形式
比如 print(u) 實際上是 print(u.__repr__())
"""
classname = self.__class__.__name__
properties = ['{}: ({})'.format(k, v) for k, v in self.__dict__.items()]
s = '\n'.join(properties)
return '< {}\n{} \n>\n'.format(classname, s)
def save(self):
"""
先讀取所有內容,在吧要添加的內容添加進去
:return:
"""
models = self.all()
if self.id is None:
# 設置 self.id
# 先看看是否是空 list
if len(models) == 0:
# 我們讓第一個元素的 id 為 1(當然也可以為 0)
self.id = 1
else:
m = models[-1]
# log('m', m)
self.id = m.id + 1
models.append(self)
else:
# 更改內容
# index = self.find(self.id)
index = -1
for i, m in enumerate(models):
if m.id == self.id:
index = i
break
log('debug', index)
models[index] = self
l = [m.__dict__ for m in models]
path = self.db_path()
save(l, path)
class User(Model):
def __init__(self, form):
self.id = form.get('id', None)
self.username = form.get('username', '')
self.password = form.get('password', '')
# 加密
def salted_password(self, password, salt='$!@><?>HUI&DWQa`'):
"""$!@><?>HUI&DWQa`"""
import hashlib
def sha256(ascii_str):
return hashlib.sha256(ascii_str.encode('ascii')).hexdigest()
hash1 = sha256(password)
hash2 = sha256(hash1 + salt)
return hash2
def hashed_password(self, pwd):
import hashlib
# 用 ascii 編碼轉換成 bytes 對象
p = pwd.encode('ascii')
s = hashlib.sha256(p)
# 返回摘要字符串
return s.hexdigest()
def validate_register(self):
pwd = self.password
self.password = self.salted_password(pwd)
# 查找用戶是否存在
if User.find_by(username=self.username) is None:
self.save()
return self
else:
return None
def validate_login(self):
u = User.find_by(username=self.username)
if u is not None:
return u.password == self.salted_password(self.password)
else:
return False
~~~
- 網絡原理
- 為搭建框架做準備
- 簡單認識網路
- 自定義模擬網站案例
- 優化最終框架
- 數據存儲 -- data
- 用戶個人信息存儲 -- User.txt
- 路由映射 -- routes
- 處理用戶信息 -- routes_static.py
- 保存靜態文件 -- static
- templates -- html 集中處理模塊
- 首頁 -- index.html
- 登陸 -- login.html
- 用戶注冊頁面 -- register
- 日志模塊 -- log.gua.txt
- 啟動文件--server.py
- orm處理 -- model.py
- 日志模塊 -- utils.py
- 兩種數據庫類型
- 傳統數據庫了解篇
- 前端快速入門
- JS簡單使用入門
- css簡單快速入門
- DJANGO
- virtualenv-創建虛擬環境
- 項目結構
- django-admin中文配置
- django-打印sql語句
- django-基礎
- 認識MVC和MTV
- Django--初識
- Django--初識案例
- Django-FBV/CBV
- Django--常用input 交互
- Django-url
- Django-url.py 配置
- Django-include 使用
- Django-url name
- Django-ORM
- ORM-數據庫配置
- ORM-model字段
- ORM-model字段解釋
- ORM-字段選項
- ORM-查詢
- ORM-四種常用查詢方法
- ORM-三種獲取數據
- ORM-其他查詢方式
- ORM-條件查詢雙線
- ORM-Q和F條件使用
- ORM-三種數據庫交互
- 案例 -- 一對多
- ORM-技巧/常見問題
- ORM-N+1 問題
- ORM-并發的處理
- ORM-數量查詢、
- ORM-正向反向查詢
- ORM-基礎案例一
- ORM-基礎一對多案例
- Django-templates
- Django-模板的繼承
- Django-模板的過濾
- Django-自定義模板的過濾
- Django-cookie
- Django-cookies 裝飾器
- Djang-session
- Django-CSRF
- Django-中間件 -- 后續了解
- Django- 緩存 -- 沒有深入了解
- Django-form
- From-ajax
- form-內部驗證處理
- form-屬性
- form-常用的標簽字段
- form-常用的下拉和選擇
- form-widget速查
- Django-ajax序列化
- Django-多種ajax寫法
- ajax-原生寫法
- ajax-$寫法
- ajax-ifram
- Django-ajax圖片上傳
- ajax-原始寫法
- ajax-正常寫法
- iframe+form
- 實戰寫法
- Django-常用自編寫組件
- Django-雙菜單組合搜索
- Django - 多菜單組合搜索
- Django-分頁
- django-綜合基礎
- 綜合基礎-render
- django-admin
- admin-頁面配置
- admin-字段配置
- admin-編輯頁面
- admin-forms驗證
- admin-創建抽象類
- django-驗證碼
- 驗證碼-第三方生成庫
- 驗證碼-view.py使用
- 驗證碼-注意引入Monaco.ttf
- django-用戶注冊
- 注冊-form 模塊
- 注冊-views 模塊
- 注冊-html模塊
- 注冊-model模塊
- django-用戶登錄三種
- session登錄
- form-session 寫法
- view-寫法
- Html-寫法
- model-寫法
- 繼承類登錄
- 外鍵關聯登錄
- django-簡單的student 管理案例
- app-urls.py
- app-models.py配置
- admin-admin.py配置
- app-form.py 和數據庫關聯的寫法
- app-FBV_views.py
- app-CBV_views.py
- templates-index.html
- django-博客系統
- APP目錄-models.py 創建
- APP目錄-基礎展示數據分析
- APP目錄-基礎數據展示cls
- ListView
- DetailView
- FormView
- 額外功能拓建
- 添加文章搜索/用戶文章查詢功能
- 增加一個友情鏈接
- 增加一個評論模塊
- App-利用Bootstrap4 搭建樣式
- 項目crm
- 思維導圖
- perfectCRM-項目名字
- settings.py-配置
- view.py-登陸/登出函數
- crm-app文件
- model.py-表的創建
- admin.py-注冊后臺
- view.py-視圖層
- static-靜態文件
- css
- bootstrap.min.css
- dashboard.css
- ie10-viewport-bug-workaround.css
- signin.css
- fonts
- imgs
- js
- jquery.js
- bootstrap.min.js
- holeder.js
- ie10-viewport-bug-workaround.js
- ie-emulation-modes-warning.js
- plugins
- html模板文件-templates
- crm
- index.html-首頁模板