array(2) { ["docs"]=> array(10) { [0]=> array(10) { ["id"]=> string(3) "428" ["text"]=> string(77) "Visual Studio 2017 单独启动MSDN帮助(Microsoft Help Viewer)的方法" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(8) "DonetRen" ["tagsname"]=> string(55) "Visual Studio 2017|MSDN帮助|C#程序|.NET|Help Viewer" ["tagsid"]=> string(23) "[401,402,403,"300",404]" ["catesname"]=> string(0) "" ["catesid"]=> string(2) "[]" ["createtime"]=> string(10) "1511400964" ["_id"]=> string(3) "428" } [1]=> array(10) { ["id"]=> string(3) "427" ["text"]=> string(42) "npm -v;报错 cannot find module "wrapp"" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(4) "zzty" ["tagsname"]=> string(50) "node.js|npm|cannot find module "wrapp“|node" ["tagsid"]=> string(19) "[398,"239",399,400]" ["catesname"]=> string(0) "" ["catesid"]=> string(2) "[]" ["createtime"]=> string(10) "1511400760" ["_id"]=> string(3) "427" } [2]=> array(10) { ["id"]=> string(3) "426" ["text"]=> string(54) "说说css中pt、px、em、rem都扮演了什么角色" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(12) "zhengqiaoyin" ["tagsname"]=> string(0) "" ["tagsid"]=> string(2) "[]" ["catesname"]=> string(0) "" ["catesid"]=> string(2) "[]" ["createtime"]=> string(10) "1511400640" ["_id"]=> string(3) "426" } [3]=> array(10) { ["id"]=> string(3) "425" ["text"]=> string(83) "深入学习JS执行--创建执行上下文(变量对象,作用域链,this)" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(7) "Ry-yuan" ["tagsname"]=> string(33) "Javascript|Javascript执行过程" ["tagsid"]=> string(13) "["169","191"]" ["catesname"]=> string(0) "" ["catesid"]=> string(2) "[]" ["createtime"]=> string(10) "1511399901" ["_id"]=> string(3) "425" } [4]=> array(10) { ["id"]=> string(3) "424" ["text"]=> string(30) "C# 排序技术研究与对比" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(9) "vveiliang" ["tagsname"]=> string(0) "" ["tagsid"]=> string(2) "[]" ["catesname"]=> string(8) ".Net Dev" ["catesid"]=> string(5) "[199]" ["createtime"]=> string(10) "1511399150" ["_id"]=> string(3) "424" } [5]=> array(10) { ["id"]=> string(3) "423" ["text"]=> string(72) "【算法】小白的算法笔记:快速排序算法的编码和优化" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(9) "penghuwan" ["tagsname"]=> string(6) "算法" ["tagsid"]=> string(7) "["344"]" ["catesname"]=> string(0) "" ["catesid"]=> string(2) "[]" ["createtime"]=> string(10) "1511398109" ["_id"]=> string(3) "423" } [6]=> array(10) { ["id"]=> string(3) "422" ["text"]=> string(64) "JavaScript数据可视化编程学习(二)Flotr2,雷达图" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(7) "chengxs" ["tagsname"]=> string(28) "数据可视化|前端学习" ["tagsid"]=> string(9) "[396,397]" ["catesname"]=> string(18) "前端基本知识" ["catesid"]=> string(5) "[198]" ["createtime"]=> string(10) "1511397800" ["_id"]=> string(3) "422" } [7]=> array(10) { ["id"]=> string(3) "421" ["text"]=> string(36) "C#表达式目录树(Expression)" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(4) "wwym" ["tagsname"]=> string(0) "" ["tagsid"]=> string(2) "[]" ["catesname"]=> string(4) ".NET" ["catesid"]=> string(7) "["119"]" ["createtime"]=> string(10) "1511397474" ["_id"]=> string(3) "421" } [8]=> array(10) { ["id"]=> string(3) "420" ["text"]=> string(47) "数据结构 队列_队列实例:事件处理" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(7) "idreamo" ["tagsname"]=> string(40) "C语言|数据结构|队列|事件处理" ["tagsid"]=> string(23) "["246","247","248",395]" ["catesname"]=> string(12) "数据结构" ["catesid"]=> string(7) "["133"]" ["createtime"]=> string(10) "1511397279" ["_id"]=> string(3) "420" } [9]=> array(10) { ["id"]=> string(3) "419" ["text"]=> string(47) "久等了,博客园官方Android客户端发布" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(3) "cmt" ["tagsname"]=> string(0) "" ["tagsid"]=> string(2) "[]" ["catesname"]=> string(0) "" ["catesid"]=> string(2) "[]" ["createtime"]=> string(10) "1511396549" ["_id"]=> string(3) "419" } } ["count"]=> int(200) } 222 Django系列11:会话 - 爱码网

Django系列11:会话
Django系列11:会话

Django系列11:会话

Django系列11:会话
Django系列11:会话
Django系列11:会话
Django系列11:会话
Django系列11:会话
Django系列11:会话
Django系列11:会话
Django系列11:会话
Django系列11:会话
Django系列11:会话
Django系列11:会话
Django系列11:会话
Django系列11:会话

Session

Django系列11:会话
Django默认将session存储到django_session表中
Django系列11:会话

session依赖于cookie,根据cookie上session表里去找,cookie清除了,session直接失效;
以后退出登录的时候不要清除cookie退出;清cookie退出,服务器中会产生一条垃圾数据;
seesion是服务端会话技术,数据存储在服务端,当我们调用request.session 存session时,生成一个key,
默认设置一个过去时间,将这条数据的唯一标识(session_key)传给客户端(客户端怎么拿?通过cookie将session_key传递给客户端,客户端给它起了一个新的名字叫session_id,把session_key的值存在session_id里面),下次再找的时候或者以后上来带着session_id或者session_key,根据session_key找到session
Django系列11:会话
Django系列11:会话
Django系列11:会话
Django系列11:会话
Django系列11:会话

Django系列11:会话

Django系列11:会话

Django系列11:会话

Django系列11:会话
Django系列11:会话

Token

Django系列11:会话

models.py
class Student(models.Model):
    s_name = models.CharField(max_length=16, unique=True)
    s_password = models.CharField(max_length=128)
    s_token = models.CharField(max_length=256)
urls.py
    url(r'^register/', views.register, name='register'),

    url(r'^studentlogin/', views.student_login, name='student_login'),

    url(r'^studentmine/', views.student_mine, name='student_mine'),
views.py
def register(request):
    if request.method == "GET":
        return render(request, 'student_register.html')
    elif request.method == "POST":
        username = request.POST.get("username")

        password = request.POST.get("password")

        try:

            student = Student()

            student.s_name = username
            student.s_password = password

            student.save()

        except Exception as e:
            return redirect(reverse("two:register"))

        return HttpResponse("注册成功")


def student_login(request):
    if request.method == "GET":
        return render(request, 'student_login.html')
    elif request.method == "POST":
        username = request.POST.get("username")

        password = request.POST.get("password")

        students = Student.objects.filter(s_name=username).filter(s_password=password)

        if students.exists():

            student = students.first()

            ip = request.META.get("REMOTE_ADDR")

            token = generate_token(ip, username)

            student.s_token = token

            student.save()

            # response = HttpResponse("用户登录成功")
            #
            # response.set_cookie("token", token)
            #
            # return response

            data = {
                "status": 200,
                "msg": "login success",
                "token": token
            }

            return JsonResponse(data=data)
        # return redirect(reverse("two:student_login"))

        data = {
            "status": 800,
            "msg": "verify fail"
        }

        return JsonResponse(data=data)


def generate_token(ip, username):

    c_time = time.ctime()

    r = username

    return hashlib.new("md5", (ip + c_time + r).encode("utf-8")).hexdigest()


def student_mine(request):

    # token = request.COOKIES.get("token")
    token = request.GET.get('token')

    try:
        student = Student.objects.get(s_token=token)
    except Exception as e:
        return redirect(reverse("two:student_login"))

    # return HttpResponse(student.s_name)

    data = {
        "msg": "ok",
        "status": 200,
        "data": {
            "username": student.s_name
        }
    }

    return JsonResponse(data=data)

Django系列11:会话

student_login.html
<form action="{% url 'two:student_login' %}" method="post">


    <span>用户名:</span><input type="text" name="username" placeholder="请输入用户名">
    <br>
    <span>密码:</span><input type="text" name="password" placeholder="请输入你的银行卡密码">
    <br>

    <button>登录</button>
</form>
student_register.html
<form action="{% url 'two:register' %}" method="post">

    <span>用户名:</span><input type="text" name="username" placeholder="请输入用户名">
    <br>
    <span>密码:</span><input type="text" name="password" placeholder="请输入你的银行卡密码">
    <br>

    <button>注册</button>

</form>

Django系列11:会话

CSRF

Django系列11:会话

Django系列11:会话


    {% csrf_token %}
two_login.html
<form action="{% url 'two:login' %}" method="post">

    {% csrf_token %}


{#    <input type="hidden" name="csrfmiddlewaretoken" value="xvHGTCuXBvJ0MLts9GMfkFpispNaqlBsiHJTgMCVuPE6wsf0ijFVqkYtkyZjsLbL">#}

    <span>用户名:</span><input type="text" placeholder="请输入用户名" name="username">

    <br>

    <button>登录</button>

</form>

目前状态

  • MTV
    • 基本完成
    • Template不会再讲了
    • Views也不会再讲了
    • Model
      • Model关系
      • Model继承
  • 高级
    • 第三方插件
    • 底层的部分原理
      • AOP 面向切面编程
        • 反扒
        • 安全
    • 文件上传
    • 前后端分离
      • RESTful
    • 日志
    • 后台管理
    • 用户角色,用户权限
    • 部署
    • 支付宝支付

相关文章: