zoukankan      html  css  js  c++  java
  • 五.数据库同步,创建django用户,用户登陆过程

    (1)配置数据库 
    项目目录/settings.py是一个普通的python模块,每项配置都是一key/value 
    数据库的配置是以dict的形式存放在这个模块中,key名为:DATABASES DATABASES = {
         'default': { 
        'ENGINE': 'django.db.backends.mysql', 
        'NAME': 'django',
         'USER': 'root', 
        'PASSWORD': '123456',
         'HOST': '127.0.0.1',
         'PORT': 3306,
         } 
    }  

    (2)同步数据:
    使用django的命令行工具同步数据库
    python manage.py migrate

    (python36env) [vagrant@CentOS7 devops]$ python manage.py makemigrations
    No changes detected
    (python36env) [vagrant@CentOS7 devops]$ python manage.py dbshell  进入数据库查看数据

    MariaDB [devops]> show tables;    --可以看到直接进入devops库了

    (python36env) [vagrant@CentOS7 devops]$ python manage.py runserver 0.0.0.0:8000

    (3)创建用户:

    a.使用django shell 创建普通用户:创建users最直接的方法是使用create_user()辅助函数

    (python36env) [vagrant@CentOS7 devops]$ python manage.py shell

    In [1]: from django.contrib.auth.models import User  导入User类

    In [2]: User.objects.create_user("rock","rock@51reboot.com","123456") 创建用户

    b.也可通过命令行创建:创建管理员

    (python36env) [vagrant@CentOS7 devops]$ python manage.py createsuperuser
    Username (leave blank to use 'vagrant'): admin
    Email address: admin@51reboot.com
    Password:123456

    (4)修改密码

    Django不会在user模型上存储原始的(明文)密码,而只是一个哈希。因为这个原因,不要尝
    试直接操作user的password属性。这也是为什么创建一个user时要使用辅助函数。
    (python36env) [vagrant@CentOS7 devops]$ python manage.py dbshell

    MariaDB [devops]> show tables;
    +----------------------------+
    | Tables_in_devops |
    +----------------------------+
    | auth_user |

    MariaDB [devops]> select * from auth_user G   ---用格式化查看此表

    修改密码:

    (python36env) [vagrant@CentOS7 devops]$ python manage.py shell  进入django的shell环境

    In [1]: from django.contrib.auth.models import User  导入User类

    In [2]: User.objects.get(username="rock")  查询用户并保存在一个U用户对象中

    In [3]: u = User.objects.get(username="rock")

    In [4]: u.set_password("654321")    用户对象的set_password属性

    In [5]: u.save  保存

    还可通过命令行进行修改。

     二.用户登陆

    1.简单应用:

    (1)写视图

    from django.shortcuts import render
    def user_login(request):
        return render(request, 'user_login.html')

    (2)写模版文件user_login.html:  ---写一简单炫表单

    <body>
    <ul>
    <form method="get" action="#"> ----action为#是本机即当前地址
    <li>用户名: <input type="text" name="username"></li>
    <li>密码: <input type="password" name="password"></li>
    <li>用户名: <input type="submit"></li>
    <li>rock 654321</li>
    <li>admin 123456</li>
    </form>
    </ul>
    </body>

    (3)配置url

    from django.conf.urls import include, url
    from .views import index, index_template, user_login
    urlpatterns = [
        url(r'^user_login/', user_login)
    ]

    启动后效果如下:

    它有两种请求:get和post

    2.get请求:

    (1)如下图中输入用户名密码点提交(也可直接在url地址中输入)后会在浏览器url中显示出来提交的数据,直接发给后端

     (2)后端拿到数据:

    def user_login(request):
    print(request.GET) #拿到前端传的数据
    return render(request, 'user_login.html')

     如下图终端:拿到数据

     (3)后端处理:

        #1.获取用户提交过来的用户名
        #2.根据用户名从数据库里取此条记录是否存在
        #2.1不存在
        #2.2存在,则判断密码是否一致,一致则登录成功(注意用户提交过来的密码是明文,而后端能拿到的是密文,而明文与密文没法直接比,需要对用户明文加密转码)
    views.py中:
    from django.contrib.auth.models import User
    from django.contrib.auth import login,logout,authenticate
    def user_login(request):
    print(request.GET) #拿到前端传的数据
    #1.获取提交过来的用户名
    username = request.GET.get("username")
    password = request.GET.get("password")
    #验证用户密码
    user_obj = authenticate(username=username, password=password)
    if user_obj:
    login(request, user_obj) #验证成功则登录
    print("登录成功")
    else:
    print("登录失败")
    return render(request, 'user_login.html')
     

    效果如下图:登录成功后

     上图中可看到有一sessionid,和如下数据库中django_session表中session-key一样,即我们就是根据用户的cookie,cookie中存放了sessionid,sessionid就是django_session表中的key,然后session_data就可以反转成我们用户的数据/用户对象

    (python36env) [vagrant@CentOS7 devops]$ python manage.py dbshell
    MariaDB [devops]> show tables;
    MariaDB [devops]> select * from django_session G
    *************************** 1. row ***************************
     session_key: e59z6132h583m2ci097wovnt5srws4r2
    session_data: NjkxMDkyYWFlMmU2ZWQ2NWEyOWZkNTRjZWU3ZTE4ZDQxZGQzZDliNDp7Il9hdXRoX3VzZXJfaWQiOiIyIiwiX2F1dGhfdXNlcl9iYWNrZW5kIjoiZGphbmdvLmNvbnRyaWIuYXV0aC5iYWNrZW5kcy5Nb2RlbEJhY2tlbmQiLCJfYXV0aF91c2VyX2hhc2giOiIzYTE2NDhkNTkyYmJlMGMwNTAyOTUwZGVhNWUxNGMzN2E3MzFjMjcwIn0=

    3.post请求:

    (1)templates/user_login.html修改如下部分:

    <body>
    <ul>
    <form method="post" action="#">
    .....

     (2)views.py:

    为调试,我先把settings.py中csrftoken中间件注释掉

    def user_login(request):
        if request.method == "GET":
            return render(request, 'user_login.html')
        elif request.method == "POST":
            username = request.POST.get("username")
            password = request.POST.get("password")
            #验证用户密码
            user_obj = authenticate(username=username, password=password)
            if user_obj:
                login(request, user_obj) #验证成功则登录
                print("登录成功")
            else:
                print("登录失败")
        return HttpResponse("")

    效果如下图:登录成功后form data它就是querydict的原始数据,即request.POST就等于QueryDict(request.body)

     4.那问题来了,如果是request.methon == "DELETE"方法做用户登录?

    (1)templates/user_login.html:修改如下部分

    <ul>
    <form method="DELETE" action="#">
    ......

     (2)views.py:

    def user_login(request):
        if request.method == "GET":
            return render(request, 'user_login.html')
        elif request.method == "POST":
            username = request.POST.get("username")
            password = request.POST.get("password")
            #验证用户密码
            user_obj = authenticate(username=username, password=password)
            if user_obj:
                login(request, user_obj) #验证成功则登录
                print("登录成功")
            else:
                print("登录失败")
        elif request.method == "DELETE":
            print(request.GET)
            print(request.POST)
            print("delete")
    
        return HttpResponse("")

    模拟delete请求如下:如下图中delete请求过来了(get,post请求没有)那数据中哪里呢?

    (python36env) [vagrant@CentOS7 devops]$ curl -XDELETE http://127.0.0.1:8000/dashboard/user_login/  -d username=rock -d password=123456

    数据都放在:

    HttpRequest.scheme  协议
    HttpRequest.body  除了get它的所有数据是放在(head头外),其它的所有请求方法数据均放body体中
    HttpRequest.path
    HttpRequest.method
    HttpRequest.encoding
    HttpRequest.GET
    HttpRequest.POST
    HttpRequest.META 

    那怎样拿到delete请求方法的数据如下:

    elif request.method == "DELETE":
    data = QueryDict(request.body) ---这样就拿到了
    print(request.GET)
    print(request.POST)
    print(request.body)
    print(data)
    print("delete")

     效果如下图:

  • 相关阅读:
    netbeans 快捷键
    Netbeans Platform的Lookup 边学边记
    Swing中的并发使用SwingWorker线程模式
    转:ExtJS:tabpanel 多个tab同时渲染问题
    NetBeans Platform Login Tutorial
    检测项目
    C#实现通过程序自动抓取远程Web网页信息
    WebClient类
    string字符串的方法
    WebClient的研究笔记认识WebClient
  • 原文地址:https://www.cnblogs.com/dbslinux/p/13037850.html
Copyright © 2011-2022 走看看