水痕 2020-01-08
目录
views.py
中创建的视图函数,会需要用到一些css样式和js对象,如果还是通过CDN加速的方式,从网络调用,会显得不安全,当服务器网络发生故障的时候,会导致css样式和js对象加载不出来,因此我们需要将这些静态文件放到本地存放。
css文件,js文件,图片,字体,以及一些第三方的框架(bootstrap,sweetalert, fontawesome)
解耦合,方便维护管理。
针对这些静态文件,我们需要为其创建一个专门的文件夹,这样可以显得不是很杂乱,也可以统一进行管理,一般我们会命名为static
,结构如下:
static - css 网站用到的所有css文件 - js 网站用到的所有js文件 - image 网站用到的所有图片文件 第三方文件
在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请求的时候,需要先去配置文件中注释掉一行:
# 中间件 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表单默认是以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.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‘)
:取出整个列表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不能做到创建库,只可以创建表
# 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='') # 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.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、查询所有的数据
查询数据,返回的是一个类似列表套字典的数据
<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() # 该方法会将所有的字段的数据重新修改,并不是针对某个字段进行修改,不推荐。