两种登录方式:
- 用户名 + 密码 登录
- 手机号 + 短信 登录
当用户登录成功后,将用户信息保存至Session【数据库 or 缓存】,不同类型用户登录 显示不同的菜单项。
2.1 发送短信
- 腾讯云短信
- 云通信短信
- 互亿无线106短信
2.2 缓存和Session
pip install django-redis
CACHES = {
"default": {
"BACKEND": "django_redis.cache.RedisCache",
"LOCATION": "redis://127.0.0.1:6379",
"OPTIONS": {
"CLIENT_CLASS": "django_redis.client.DefaultClient",
"CONNECTION_POOL_KWARGS": {"max_connections": 100}
"PASSWORD": "qwe123",
# 'MAX_ENTRIES': 300, # 最大缓存个数(默认300)
# 'CULL_FREQUENCY': 3, # 缓存到达最大个数之后,剔除缓存个数的比例,即:1/CULL_FREQUENCY(默认3)
}
}
}
############
# SESSIONS #
############
# Session存储在哪里?
# SESSION_ENGINE = "django.contrib.sessions.backends.db"
# 如果存储到文件中,文件的路径。
# SESSION_ENGINE = "django.contrib.sessions.backends.file"
# SESSION_FILE_PATH = None
# 存储到缓存
SESSION_ENGINE = "django.contrib.sessions.backends.cache"
SESSION_CACHE_ALIAS = "default"
此时也可以手动操作,将数据保存到redis中:
from django_redis import get_redis_connection
conn = get_redis_connection("default")
conn.set("xx","123123")
conn.get("xx")
2.3 动态菜单
不同角色的用户登录,看到不同的菜单。
-
页面写死 HTML模板
<html> {% if 角色 "管理员"%} <a href="/xxx/x">用户管理</a> <a href="/xxx/x">级别管理</a> <a href="/xxx/x">级别管理</a> ... {% else %} <a href="/xxx/x">xxx管理</a> <a href="/xxx/x">级别管理</a> {% endif %} </html>
-
将菜单放在配置文件中 (选择)
# settings.py ADMIN = [ {"title":"用户管理", "url":"...." }, {"title":"用户管理", "url":"...." }, {"title":"用户管理", "url":"...." }, {"title":"用户管理", "url":"...." }, ] USER = [ {"title":"用户管理", "url":"...." }, {"title":"用户管理", "url":"...." }, {"title":"用户管理", "url":"...." }, {"title":"用户管理", "url":"...." }, ]
<html> {% if 角色 "管理员"%} {% for item in ADMIN%} <a href="{{item.url}}">{{item.title}}</a> {%emdfor%} {% else %} {% for item in USER%} <a href="{{item.url}}">{{item.title}}</a> {%emdfor%} {% endif %} </html>
如果想要显示2级菜单:
ADMIN = [
{"title":"用户管理", "url":"...." },
{"title":"用户管理", "url":"...." },
{"title":"用户管理", "url":"...." },
{"title":"用户管理", "url":"...." },
]
ADMIN = [
{
"title":"用户管理",
"children":[
{"title":"级别列表","url":"....", "name":"level_list",}
{"title":"级别列表","url":"...."}
{"title":"级别列表","url":"...."}
]
},
{
"title":"订单管理",
"children":[
{"title":"订单列表","url":"...."}
{"title":"订单列表","url":"...."}
{"title":"订单列表","url":"...."}
]
},
]
-
菜单选中和展开
1.获取当前用户请求的 URL pricepolicy/list/ 或 url对应的name 2. pricepolicy/list/ 配置 ADMIN中的URL ->默认选中
-
路径导航的问题
1.获取当前用户请求的 URL pricepolicy/list/ 或 url对应的name 2.获取上级,展示导航信息 3.设置菜单与下级关系
2.4 权限控制
权限的判断时,要考虑:正常的点击、非法输入。
v1 = [11,22,33,44]
if 33 in v1:
pass
v1 = {11,22,33,44}
if 33 in v1:
pass
v1 = {
11:123123,
22:123123
33:123123
44:123123
}
if 33 in v1:
pass
-
文件settings.py的方式(编写)
admin_permisions = { "level_list":{...}, "level_edit":{..., 'parent':'level_list'}, "level_add":{... 'parent':'level_list'}, "level_delete":{..'parent':'level_list'.}, "user_list":{...}, "user_edit":{...}, "user_add":{...}, "user_delete":{...}, } user_permisions = { ... }
admin访问某个URL + 路由信息(name、namespace),获取当前的URL /level/edit/4/ -> 是否存在URL
在中间件中根据URL中的name进行权限的校验。
-
数据库的方式
2.5 local_settings.py
线上部署和本地settings.py想要隔离,可以使用local_settings.py来进行配置。
try:
from .local_settings import *
except ImportError:
pass
注意:在做版本控制提交代码时,在.gitignore中设置上 local_settings.py
2.6 用户名登录
…
2.7 短信登录
…
2.8 动态菜单
…
2.9 权限控制
…