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()
3. 设置settings文件
修改工程中settings.py中的DATABASES:
4. 设置模型类models.py
这里是将数据库的表实体化,每个表对应一个类,类中每个变量对应表中的一个字段。后期在与数据库交互时都用这个类。
【这里我是使用的反向生成,提前在数据库中建立好表和字段,在控制台执行python manage.py inspectdb,相应的实体会在控制台输出出来,复制粘贴到model.py文件里面就可以了。至于为什么我要反向生成。。一个是因为我提前在navicat里面建好了,懒。。另外一个原因是我在执行下一步映射时出了错误,下面详细说。】
5. 数据映射迁移
【对,就是这里出的错误,一直忽略了这一步】
控制台中执行下面的两行命令:
python manage.py makemigrations
python manage.py migrate
没有错误就是可以了。这两句一定要执行,因为django还会把有关的系统表建立到数据库里面。
我这里要实现的是输入身份证号直接登录,显示下一个页面。日常的账号密码方式登录也是一样的操作模式。
现在数据库里自己添加了两条用户信息:
在上一章(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的方式吧,这样也能多少避免了直接用链接就能进入题库。(渣渣考虑,大神勿喷)。
django的session实现提供了很多的方式:数据库、缓存、文件。。
这个文章讲的算是比较详细:在Django中Session的那点事!
我这里就直接采用了默认的数据库方式,一是用户的状态保持要求的长一点,二是感觉能减轻一点服务器的负担。(渣渣考虑,大神勿喷)
首先是配置,需要在django中启用session,不过在django里面是默认就开启了的,检查一遍没有坏处。
其实查看一下数据库就知道在做数据库映射的时候,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的那点事!