今日内容:
以登陆功能为例
- 静态文件配置
- request对象方法初始
- pycharm链接数据库(MySQL)
- Django链接数据库(MySQL)
- Django ORM简介
- 利用ORM实现数据的增删改查操作
静态文件配置
什么是静态文件
前端已经写好了的,能够直接调用的文件就可以称之为静态文件,如:
- 网站写好的js文件
- 网址写好的css文件
- 网址用到的图片文件
- 网页渲染所需的第三方框架(bootstrap)
django中静态文件
- 将网址所用的静态文件默认都放在static文件夹下
- 在创建Django项目时是不会自动的创建static静态文件的,需要手动创建
- Ps:我们将html文件默认都放在templates文件夹下
- 一般情况下我们在static文件夹内还会做进一步的划分处理,如:
- js
- css
- img
- 其他第三方文件
"""
在浏览器中输入url能够看到对应的资源
是因为后端提前开设了该资源的接口
如果访问不到资源 说明后端没有开设该资源的接口
"""
静态文件配置
上述说道浏览器要想访问到对应的资源的话,后端必须开设该资源的接口,同样浏览器访问静态文件也是如此,但是如果说我们静态文件非常多的话,都去开设接口就非常的麻烦,我们可以在settings文件中添加静态文件配置。
步骤:去到项目同名文件夹下找到settings.py配置文件,下拉文件到最后,在最后的STATIC_URL = '/static/'
下书写配置,配置代码:
STATIC_URL = '/static/' # 类似于访问静态文件的令牌
STATICFILES_DIRS =[
os.path.join(BASE_DIR,'static'),
#os.path.join(BASE_DIR,'static1'),
#os.path.join(BASE_DIR,'static2'),
]
"""
STATICFILES_DIRS为一个列表,意味着可以放多个文件夹路径,
假设访问为http://127.0.0.1:8000/static/a.txt
如果访问的令牌/static/正确会在配置列表中从各个文件夹内依次查找a.txt,返回先查到的文件,都查不到就报错"""
配置完后html文件中导入的路径前加上/static/
即可
静态文件动态解析
上述的配置“令牌”必须是STATIC_URL = '/static/'
如果修改令牌,或者说不等于'/static/',我们在html中导入的路径就不会生效,因为我们写死了令牌必须是/static/ ,如果能够实现动态的解析文件的路径?
可以将html导入文件的代码写成下面的形式:
# 原本的导入css文件代码
<link rel="stylesheet" href="../static/bootstrap-3.3.7-dist/css/bootstrap.min.css">
# 动态解析路径代码
{%load static%}
<link rel="stylesheet" href="{% static 'bootstrap-3.3.7-dist/css/bootstrap.min.css' %}">
这样就配置文件中的令牌不管怎么修改,静态文件配置都能生效
后端代码修改之后前端没有变化解决办法
问题:当你在写django项目的时候 可能会出现后端代码修改了但是前端页面没有变化的情况
解决办法:
- 你可能在同一个端口开了好几个django项目,一直在跑的其实是第一个django项目,关掉之前开的其他django项目
- 浏览器缓存的问题,右键打开检查,找到settings配置,点进去在network下将disable cache勾选上,如图:
from表单提交数据
form表单的没有指定method的时候,提交的数据会用问号将数据拼接到url后面,这是因为form默认的请求方式是GET请求,但是密码属于重要的信息,GET请求这样提交数据不安全,需将form表单的请求方式改为POST请求,method="POST"
修改method再次提交数据会报错,如图:
解决办法:在前期我们使用django提交post请求的时候 需要取配置文件中注释掉一行代
MIDDLEWARE = [
'django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
# 'django.middleware.csrf.CsrfViewMiddleware', # 注释掉这样代码,再次提交数据就以POST请求提交数据
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
]
请求方式有GET和POS两种,如何做到根据不同的请求方式在视图函数中做不同的处理,然后返回呢?
这就需要用到request对象了
request对象方法初始
request.method
:返回请求的方式,为全大写的字符串形式<class 'str'>
request.POST
:返回post请求提交的普通数据,是一个字典的形式,key对应值为列表注意不包括文件request.POST.get()
:只返回值列表中的最后一个元素request.POST.getlist()
:返回这个key对应值的列表request.FET
request.GET.get()
request.GET.getlist()
:与POST请求相同
ps:get请求携带的数据是有大小限制的,而post请求没有限制
用以上的request方法实现根据请求的不同,视图函数做不同的处理:
# views.py中的视图函数login
def login(request):
# 第一种书写方式,判断两者请求方式
# if request.method == 'GET':
# print('GET请求来了')
# return render(request,'login.html')
# elif request.method == 'POST':
# print('POST请求来了')
# return HttpResponse("也收到了数据")
# 第二种书写方式,只判断POST请求,做处理;GET请求直接返回对应的页面
if request.method == 'POST':
return HttpResponse("也收到了数据")
return render(request, 'login.html')
后端能够获取用户提交的登录数据之后,还需要进一步的对数据进行校验,判断是否登录成功,也就是说需要用到数据库了
pythcharm链接数据库(MySQL)
pycharm可以充当很多款数据库软件的客户端
pycharm中查找数据库功能
-
右侧上方database
-
左下方database
-
配置里面的plugins插件搜索安装,默认是安装好的
-
不行就卸载pycharm重装
连接数据库
一定要先下载数据库的驱动
如果下载驱动报错如下图:
解决办法,去 mvent仓库搜索mysql-connector-java下载jar文件,手动导入驱动:具体操作参考下面连接
注意:链接前需要将库提前创建好
django链接数据库(MySQL)
django默认使用的是自己的小型数据库sqlite3,默认的配置为:
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
}
}
django链接MySQL需修改配置
-
在项目同名文件下的settings配置文件中修改配置,配置代码如下:
DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', # 只需将后缀改成msyql即可 'NAME': 'day60', # 库名 'USER':'root', # 用户名 'PASSWORD':'666666', # 密码 'HOST':'127.0.0.1', # ip 'PORT':3306, # MySQL端口 'CHARSET':'utf8' # 编码 } }
上述修改配置配置后如果立即重启django项目,启动不了会报错
""" django.core.exceptions.ImproperlyConfigured: Error loading MySQLdb module: No module named 'MySQLdb'. """
是因为django默认用的是mysqldb模块链接mysql的,该模块的兼容性不好,需要我们手动的改为pymysql链接
-
代码声明
需要用代码声明告诉django不要用默认的mysqldb,改为用pymysql链接
# 在项目名下的init或者任意的应用名下的init文件中书写以下代码都可以 import pymysql pymysql.install_as_MySQLdb()
声明后就能正常启动项目了
Django ROM
简介
ORM:对象关系映射
映射关系:
类 | <——> | 表 |
---|---|---|
对象 | <——> | 记录 |
对象属性 | <——> | 记录某个字段对应的值 |
作用:能够让一个不会sql语句的小白也能够通过python面向对象的代码简单快捷的操作数据库
不足:封装程度太高,有时候sql 语句的效率偏低,需要直接写sql语句
创建ROM
-
去应用(app01)下面的models.py文件中书写一个类
class User(models.Model): # id int primary_key auto_increment id = models.AutoField(primary_key=True) # username varchar(32) username = models.CharField(max_length=32) # password int password = models.IntegerField()
-
在terminal窗口中执行两条数据库迁移命令
-
将操作记录写到migrations文件夹中
python3 manage.py makemigrations
-
将操作真正的同步到数据库中
python3 manage.py migrate
注意:上述两条命令非常重要,只要修改了models.pyt中跟数据库相关的代码,就必须重新的执行这两条命令
-
其他注意事项:
class User(models.Model):
id = models.AutoField(primary_key=True,verbose_name='主键')
username = models.CharField(max_length=32,verbose_name='用户名')
"""
CharField必须要指定max_length参数 不指定会直接报错
verbose_name该参数是所有字段都有的 就是用来对字段的解释
"""
password = models.IntegerField(verbose_name='密码')
class Author(models.Model):
# 由于一张表中必须要有一个主键字段 并且一般情况下都叫id字段
# 所以orm当你不定义主键字段的时候 orm会自动帮你创建一个名为id主键字段
# 也就意味着 后续我们在创建模型表的时候如果主键字段名没有额外的叫法 那么主键字段可以省略不写,主键不叫id的情况需自己写
username = models.CharField(max_length=32)
password = models.IntegerField()
ORM实现字段的增删改查
-
增加字段
如果表中也有记录,添加字段时,也有的记录需要在新的字段对应一个值,有三种方法
-
在终端terminal中输入
python3 manage.py makemigrations
数据库命令时,按提示选第一个选项直接给出默认值 -
在models.py文件中添加字段时,括号里设定值可以为空
info = models.CharField(max_length=32,verbose_name='个人简介',null=True)
-
在models.py文件中添加字段时,直接给字段设置默认值
hobby = models.CharField(max_length=32,verbose_name='兴趣爱好',default='study')
-
-
修改字段
直接在models.py文件中修改字段对应的代码,然后执行数据库迁移命令即可
-
删除字段
直接注释对应的字段然后执行数据库迁移的两条命令即可!
注意:删除字段的时候千万要细心,因为如果执行数据库迁移命令之后字段对应的数据也都没有了,千万不要随意的注释字段,执行迁移命令之前最好先检查一下自己写的代码。
Ps:建议人走屏锁,当你离开你的计算机之后一定要锁屏,避免不必要的麻烦,锁屏快捷键windows+L
数据的增删改查
视图函数中需要导入models.py文件,form app01 import models
-
查数据
res = models.User.objects.filter(username=username) """ 1.res的值可以看成是列表套数据对象的格式:[数据对象1,数据对象2,...] 2.它支持索引取值,切片操作,但是不支持负数索引 3.虽热支持索引取值但是他不推荐,推荐使用.方法()取值, user_obj = models.objects.filter(username=username).first() 4.filter括号内可以携带多个参数,参数与参数建默认是and关系,可以将filter联想成数据库操作where记忆"""
-
增加数据
# 第一种增加方式 res = models.User.objects.create(username=username,password=password) # 返回值就是当前被创建的对象本身 # 第二种增加方式 user_obj = models.User(username,password=password) user_obj.save()