URL路由相关的配置细节
- 在正常app里的urls.py文件中,通常需要设置app_name参数,该参数的效果是对该app下的所有相对路径加上namespace
- 在正常app里的urls.py文件中,urlpatterns中的路径最好都设置各自独一无二的名称,以便后续通过django自带的函数快速进行解析
- 当views.py中的函数需要进行其他路径的跳转时,为了避免硬编码,应该使用reverse("namespace:url_name")的方式,然后使用return redirect(reverse("namespace:url_name"))的方式进行跳转,例如如下代码:
from django.shortcuts import render, redirect from django.urls import reverse def index(request): # some code...... if need_redirect: return redirect(reverse("namespace:url_name")) #若需要参数,则使用reverse("namespace:url_name", args=(val1,val2,) return render(request, "index.html")
用户登录的相关实现
SessionID的生成和使用
- 在用户发送Post登录请求并且验证通过后,服务端views.py中的函数需要对request的session设置具体验证内容,例如如下代码:
def login(request): # some other_code if login_success: request.session['is_login'] = True request.session['uid'] = 123456 # set user ID return redirect(reverse("namespace:url_name"))
该步骤将:
-
生成随即字符串
-
把随机字符串和设置的用于后续校验的键值对保存到django_session表的session_key和session_data中
-
设置cookie: set_cookie("sessionid", 子步骤1生成的随机字符串),并且响应给浏览器
-
- 当用户继续请求相关服务且需要验证登录状态时,对request中的session获取具体的验证内容进行校验,例如如下代码:
def session_index(request): status = request.session.get('is_login') if not status: return redirect(reverse("namespace:logout_url")) return render(request, "index.html")
该步骤将:
-
从cookie中获取sessionid的值
-
根据sessionid从django_session表中过滤出记录
-
取出目标校验值(如上述示例中的is_login)
-
-
当用户尝试注销时,可以使用如下任意一个命令:
-
request.session.flush() # 删除整个session
-
del request.session["key"] # 删除session中的某个键值对
-