第二篇:Django自定义登录功能

Posted cnhyk

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了第二篇:Django自定义登录功能相关的知识,希望对你有一定的参考价值。

自定义登录功能

创建静态文件夹(static文件夹)

views.py中创建的视图函数,会需要用到一些css样式和js对象,如果还是通过CDN加速的方式,从网络调用,会显得不安全,当服务器网络发生故障的时候,会导致css样式和js对象加载不出来,因此我们需要将这些静态文件放到本地存放。

静态文件

css文件,js文件,图片,字体,以及一些第三方的框架(bootstrap,sweetalert, fontawesome)

静态文件夹(static)

解耦合,方便维护管理。

针对这些静态文件,我们需要为其创建一个专门的文件夹,这样可以显得不是很杂乱,也可以统一进行管理,一般我们会命名为static,结构如下:

static
    - css      网站用到的所有css文件
    - js       网站用到的所有js文件
    - image    网站用到的所有图片文件
 
    第三方文件

django静态文件配置

基本配置

在settings.py中修改:

STATIC_URL = '/static/'  # 访问后端静态资源的接口前缀  默认情况下接口前缀名与静态文件名保持一致
        """
        <link rel="stylesheet" href="/static/bootstrap-3.3.7-dist/css/bootstrap.min.css">
        你要想访问后端的静态资源 你必须以接口前缀开头 后面跟上具体的文件路径 才能够访问到对应的资源
 
        当你的接口前缀正确之后  会拿着后面的路径依次去下面列表中的每一个文件夹下查找对应的资源
        顺序是从上往下依次查找 如果都没有找到才会报错
        """
STATICFILES_DIRS = [
            os.path.join(BASE_DIR,'static'),  # 这里的static才是你文件夹的路径
            os.path.join(BASE_DIR,'static1'),
            os.path.join(BASE_DIR,'static2'),
        ]
# 当static和static1中都有一个a.txt,当在static中查找到之后,就不会再去static1中查找了。

STATIC_URL:访问后端静态资源的接口前缀,默认情况下接口前缀与静态文件名保持一致

它的作用类似一个令牌,当想要访问静态网页资源,必须在这里写上一个‘/static/‘,当识别到link中的href路径(<link rel="stylesheet" href="/static/bootstrap-3.3.7-dist/css/bootstrap. min. css">)或script的src路径(<script src="/static/bootstrap-3.3.7-dist/js/bootstrap.min.js"></script>)以static开头,django会允许你去STATICFILES_DIRS列表中存在的所有文件夹下,查找所需要的资源。

当路径的前缀改为XXX,那接口的前缀也需要改为XXX。

因此,这里的static对应的是以static开头的路径。

静态资源动态绑定

前面的静态资源接口,一旦发生改变,就需要去修改html中的导入css和js的前缀路径,这样会很麻烦,当html较多时,需要耗费大量的时间去修改,因此产生了一个动态绑定的方法:

{% load static %}
<link rel="stylesheet" href="{% static 'bootstrap-3.3.7-dist/css/bootstrap.min.css' %}">
<script src="{% static 'bootstrap-3.3.7-dist/js/bootstrap.min.js' %}"></script>
 

当静态资源接口修改后,css和js的路径也会随之改变。

post请求需要修改配置文件

在提交post请求的时候,需要先去配置文件中注释掉一行:

# 中间件
MIDDLEWARE = [
    'django.middleware.security.SecurityMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.common.CommonMiddleware',
    # 'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
]

form表单回顾

form表单默认是以get请求提交数据,所提交的数据跟在url后面以?xxx=yyy&zzz=ttt的形式存在。

http://127.0.0.1:8000/login/?username=admin&password=123

获取请求方式(request.method

为了减少代码的层级:一般情况下视图函数处理get请求较多所以可以直接再函数体内先写get请求对应的逻辑,将其他请求利用 request. method做出区分

def login(request):
    if request.method == 'POST':
           username = request.POST.get('username')
        password = request.POST.get('password')
        return httpresponse('收到了')
return render(request,'login. html')

request对象方法

request.method:获取请求方式,返回GET/POST

request.POST:获取符合POST请求携带的数据,返回的是一个大字典。(<QueryDict: {‘username‘: [‘admin‘], ‘password‘: [‘123‘]}>

  • request.Post.get(‘key‘):只会取列表最后一个元素

  • request.POST.getlist(‘key‘):取出整个列表

request.GET:获取符合get请求携带数据格式的数据(url?xxx=xxx&ooo=lll

  • request.GET.get(‘key‘) : 只会取列表最后一个元素
  • request.GET.getlist(‘key‘) :取出整个列表

djangomysql连接★

1.先去配置文件(settings.py)中配置相关参数

# 修改数据库的配置
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',  # 数据库类别
        'NAME': 'day49',  # 库的名字
        'HOST': '127.0.0.1',
        'PORT': 3306,
        'USER': 'root',
        'PASSWORD': '123',
        'CHARSET': 'utf8'
    }
}

2.在项目名或者应用名下面的__init__文件中,指定使用pymysql替代mysqldb连接mysql

import pymysql
 
pymysql.install_as_MySQLdb()

django orm简介

django orm不能做到创建库,只可以创建表

# orm对象关系映射:
类   ------> 表
对象  ------> 记录
属性  ------> 字段值

orm可以使我们使用python面向对象的语法(句点符)来简单快捷的操作数据

首先需要先去对应的应用下的models.py中书写模型类(模型表)

# 示例:
class User(models.Model):
    # int类型 primary key主键 auto_increment自增长
    id = models.AutoField(primary_key=True)
    # varchar(32)类型的字段,限制展示长度为32
    name = models.CharField(max_length=32)
    # int类型的字段
    password = models.IntegerField()
    # 其实创建的还是varchar类型
    email = models.EmailField(default='123@qq.com')
    # hobby字段可以为空
    hobby = models.CharField(null=True,max_length=32)

之后需要执行数据库迁移命令:

*************************数据库迁移(同步)命令************************
python3 manage.py makemigrations  # 仅仅是将你对数据库的改动记录到某个小本本上(migrations文件夹)
python3 manage.py migrate  # 将改动真正的同步到数据库中
 
***********只要你动了models.py跟数据库相关的代码 你就必须要重新执行上面的两条命令来保证数据库与models.py一致***********

字段的增删改查

字段的增

直接在models.py文件中的模型表新增字段,再执行数据库迁移命令即可

  • 给该字段设置默认值
    • models.EmailField(default=‘123456@com‘)
  • 运行该字段可以为空
    • models.EmailField(null=True)

字段的查

....

字段的改

直接修改models.py文件中的代码后,执行数据库迁移命令即可

字段的删

只要注释掉对应的字段,再执行数据库迁移命令就会将对应的字段及数据信息全部删除(慎用)

数据的增删改查

1、查询单条数据

from app01 import models   # 先导入models模型表
models.类名.objects.filter(字段名='字段值')
res = models.User.objects.filter(username='jason')  # select * from user where username='jason'
# 返回的结果是一个列表  支持索引取值但是不支持负数并且不推荐使用 推荐你使用它给你封装好的方法
user_obj = res.first()  # 取上面返回的列表中的第一个值
# filter方法条件不存在的时候 不会报错返回的是一个空列表
 
"""
filter括号内直接放多个关键字参数 并且多个关键字参数之间是and关系
res = models.User.objects.filter(username='jason',password='123')
# 类似执行select * from user where username='jason' and password='123';
"""

2、查询所有的数据

  • filter() 括号内不写拿所有
  • all() 查询所有数据

查询数据,返回的是一个类似列表套字典的数据

<QuerySet [<User: jason>, <User: egon>, <User: sean>, <User: admin>, <User: 你不行>]>

1、create()

user_obj = models.User.objects.create(**kwargs)
 
user_obj = models.User.objects.create(name=username,password=password)
print(user_obj,user_obj.name)
 
# 该方法有返回值,返回值就是当前被创建的对象本身

2、对象的绑定方法

# 先生成一个User对象
user_obj = models.User(name=username, password=password)
 
# 调用对象的绑定方法
user_obj.save()

models.User.objects.filter(id=delete_id).delete()
 
# 将filter过滤出来的数据全部删除,类似批量删除

1、方式一(推荐)

models.User.objects.filter(id=edit_id).update(name=username, password=password)

2、方式二(了解,不推荐)

通过对对象进行赋值和对象的绑定方法

# 先获取数据对象
edit_obj = models.User.objects.filter(id=edit_id).first()
 
# 再修改对象属性
edit_obj.name = username
edit_obj.password = password
 
# 调用对象的绑定方法保存
edit_obj.save()
 
# 该方法会将所有的字段的数据重新修改,并不是针对某个字段进行修改,不推荐。

以上是关于第二篇:Django自定义登录功能的主要内容,如果未能解决你的问题,请参考以下文章

第二十二篇 -- 事件与信号(自定义label信号的双击功能)

CRM第二篇: stark组件

Python之路第二十二篇:Django之Model操作

自定义Django登录,无法比较密码

Python开发第二十二篇:Web框架之Django进阶

Spring 梳理 - filterinterceptoraop实现与区别 -第二篇