python小网站开发实录(三):MySQL数据库连接、登录功能实现、session加持

Django连接MySQL数据库

1. 安装MySQL、navicat可视化工具(可选)

下载MySQL:https://pc.qq.com/detail/3/detail_1303.html 腾讯软件中心提供的下载

下载navicat:https://www.navicat.com.cn/navicat-15-highlights navicat 15 版本,这个可以按照自己需求下载了,主要是可视化mysql。

具体安装过程中需要的注意事项不再赘述,随便搜搜一大把。

2. 在python中安装使用pymysql:

我用的anaconda管理python环境,直接打开Anaconda Prompt。或者打开自己的python虚拟环境输入(二选一):

pip install pymysql  (pip安装)
conda install pymysql  (anaconda中conda安装)

 在需要使用数据库的app中的__init__.py文件中添加:

import pymysql

pymysql.install_as_MySQLdb()

python小网站开发实录(三):MySQL数据库连接、登录功能实现、session加持_第1张图片

3. 设置settings文件

修改工程中settings.py中的DATABASES:

python小网站开发实录(三):MySQL数据库连接、登录功能实现、session加持_第2张图片

4. 设置模型类models.py

这里是将数据库的表实体化,每个表对应一个类,类中每个变量对应表中的一个字段。后期在与数据库交互时都用这个类。

python小网站开发实录(三):MySQL数据库连接、登录功能实现、session加持_第3张图片

 【这里我是使用的反向生成,提前在数据库中建立好表和字段,在控制台执行python manage.py inspectdb,相应的实体会在控制台输出出来,复制粘贴到model.py文件里面就可以了。至于为什么我要反向生成。。一个是因为我提前在navicat里面建好了,懒。。另外一个原因是我在执行下一步映射时出了错误,下面详细说。】

 5. 数据映射迁移

在settings.py中注册app!! 

【对,就是这里出的错误,一直忽略了这一步】

python小网站开发实录(三):MySQL数据库连接、登录功能实现、session加持_第4张图片

控制台中执行下面的两行命令:

python manage.py makemigrations
python manage.py migrate

没有错误就是可以了。这两句一定要执行,因为django还会把有关的系统表建立到数据库里面。

 


登录功能实现

我这里要实现的是输入身份证号直接登录,显示下一个页面。日常的账号密码方式登录也是一样的操作模式。

现在数据库里自己添加了两条用户信息:

python小网站开发实录(三):MySQL数据库连接、登录功能实现、session加持_第5张图片

在上一章(python小网站开发实录(二):熟悉django流程及实现登录部分功能)的基础之上只用更改登录对应的处理函数就可以了。我的项目中是user_app的views.py文件下面的user_login函数。代码如下:

def user_login(request):
    if request.method == "POST":
        user_inp_id = request.POST.get("user_login_id", None) #从request中把页面输入的id提取出来
        print(user_inp_id) #打印下看看撒
        user = UserInfo.objects.filter(user_id_card=user_inp_id) #数据库中查找有没有这个id,如果是账号密码的就把密码也加上
        if user: #如果返回值不为空,说明有这个id的存在
            return render(request, 'practice.html')  #向浏览器返回下一个页面
        else:
            return render(request, 'user-login.html') #登录失败
    return render(request, 'user-login.html')

自行验证是可以的,页面太丑了,就不在这展示了。。。

 

 


session加持

我的项目是一个练题的项目,用户登录以后显示练题界面,然后下一题、下一题。考虑了下还是用session的方式吧,这样也能多少避免了直接用链接就能进入题库。(渣渣考虑,大神勿喷)。

django的session实现提供了很多的方式:数据库、缓存、文件。。

这个文章讲的算是比较详细:在Django中Session的那点事!

我这里就直接采用了默认的数据库方式,一是用户的状态保持要求的长一点,二是感觉能减轻一点服务器的负担。(渣渣考虑,大神勿喷)

首先是配置,需要在django中启用session,不过在django里面是默认就开启了的,检查一遍没有坏处。

python小网站开发实录(三):MySQL数据库连接、登录功能实现、session加持_第6张图片

其实查看一下数据库就知道在做数据库映射的时候,django在数据库中就建立了一个django_session的表格,把session直接存放在数据库中。接下来就是在view中加代码了,对应app中的views.py:

 request.session类似字典使用,可以保存想保存的信息。request.session[‘名字’]自定义就好,只要前后使用的时候对的上。

def user_login(request):
    if request.method == "POST":
        user_inp_id = request.POST.get("user_login_id", None)
        print(user_inp_id)
        user = UserInfo.objects.filter(user_id_card=user_inp_id)
        if user:
            request.session['user_id'] = user[0].user_id  # 这里将user_id保存下来
            request.session['is_login'] = True  # 登录状态
            request.session.set_expiry(300)  # 设置session失效时间,300秒=5分钟
            return render(request, 'practice.html')  #登陆成功
        else:
            return render(request, 'user-login.html')  #登录失败
    return render(request, 'user-login.html')

现在需要每次连接的时候先检查这个连接有没有session存在,如果有就直接跳转practice页面,如果没有就跳转user_login页面。这样再加一个url是index,通过index检查session。

url中加入:

path('index/', user_views.index),

user_app的views中添加一个index函数:

def index(request):
    if request.session.get('is_login', None):  # 若session认证为真,也可以用之前存的user_id验证
        return render(request, 'practice.html')
    else:
        return render(request, 'user-login.html')

这样访问index就可以,验证下session是成功的。


【参考资料】

Django 数据库操作mySQL + Django

如何在Django中新建一个App,连接Mysql数据库,并获取数据。

python3与django2.0登陆验证与保持登录状态

Django session

在Django中Session的那点事!

你可能感兴趣的:(Django,python,django)