静态文件配置
1.编写一个登录功能
1.创建django项目并创建一个app
2.在urls.py添加一组对应关系
3.在app的views.py中编写登录核心逻辑
4.利用三板斧与前端做交互
2.为什么我们可以访问一个网址看到一些资源?
(自己理解:是因为我们提前把这个资源写好了,我们在使用django框架的时候是因为我们在urls文件里将要用到的资源都提前写好了,才能够访问到,如果没有写的话就没法访问)
我们在访问django框架资源的使用之所以可以拿到数据是因为提前在urls.py中开设了相应的资源接口,如果访问不到资源那么就是没有开设相应的接口
3.静态文件资源
html页面上使用的不经常修改的资源
1.第三方框架文件
2.css文件
所有的css文件
3.js文件
所有的js文件
4.图片文件
所有的img文件
争对静态文件资源我们一般放在static文件夹内
这个文件夹就按这个名字来设置不要进行修改
如果这个文件夹内又出现了好多文件,然后有好多js文件好多css文件,那么在这种情况下也可以进行对他们再次创建不同的文件夹进行管理,同样如果一个同样后缀的文件夹里又有许多不同功能的文件,也可以继续进行文件夹划分管理
'合理精细化管理'
找不到我们所引入的bootstrap的css与js文件
为什么找不到??
一定要注意: '我们在访问django框架资源的使用之所以可以拿到数据是因为提前在urls.py中开设了相应的资源接口,如果访问不到资源那么就是没有开设相应的接口' 细品这句话,我们并没有开设响应的接口,相当于我们直接将网址输入浏览器的输入栏里中,我们用了django框架,那么在访问一些资源得到数据的时候必须是我们提前设置好的,这些数据别人可以拿到这些资源
所以我们在配置了前端的静态文件以后还的配置相应的接口,提前配好,才能访问得到资源
针对静态文件资源的访问也需要提前开设相应的接口
在settings文件下最底部,文件本身自带有提示,设置静态文件的接口
# Static files (CSS, JavaScript, Images)
# https://docs.djangoproject.com/en/2.2/howto/static-files/
STATIC_URL = '/static/'
# 静态文件资源配置(固定的)
STATICFILES_DIRS = [
os.path.join(BASE_DIR, 'static')
# 在导入这些文件的时候,不需要跳级,只需要/static/...
]
俩个static有什么不同?
# /static/bootstrap-3.4.1-dist/js/bootstrap.min.js 1
STATIC_URL = '/static/' # 2 叫做接口前缀
# 静态文件资源配置(固定的)
STATICFILES_DIRS = [
os.path.join(BASE_DIR, 'static') # 3
# 在导入这些文件的时候,不需要跳级,只需要/static/...
]
'''
1参照的是2,它们俩是一致的,一旦接口前缀写对以后,1后面是一个完整的路劲,然后就会拿着这个整个路劲去3里面查找有没有对应的这个文件,
1和2不是那个我们建立的文件夹static,它就是一个标识,就是(bootstrap-3.4.1-dist/js/bootstrap.min.js)的一个前缀,1与2一致后,才会去识别到我们建立的那个static文件夹里查找是否存在这个文件
'''
那么为什么STATICFILES_DIRS对应的是一个列表
列表,可以存放许多个数据
首先先看前俩个static是否一致,然后再拿着接口后面的文件路劲去资源配置里查找,里面存放着不同的文件夹,然后挨个进行比对查找,如果没有的话就会报404错误
一个极端的问题:动态解析解决
有好多Html文件都需要用到bootstrap源码,然后突然想改接口前缀,所有页面就睡失效,那怎么做呢?
{% load static %}
<link rel="stylesheet" href="{% static 'bootstrap-3.4.1-dist/css/bootstrap.min.css' %}">
请求方法
1.GET请求
向别人索要数据,也可以携带额外的数据,在url后面加?后面跟上携带的数据
url?xxx=yyy&zzz=ooo&aaa=bbb
携带数据的限制:
1.数据只能是一些无关紧要的非敏感数据
2.数据大小有限制 2kb-4kb左右
GET请求没有请求体(HTTP数据格式)
2.POST请求
朝别人提交数据,也可以携带额外的数据,数据都是放在请求体中,并且数据大小没有限制
3.form表单默认的数据提交方式是GET
method = 'post'
action 控制数据的提交地址
方式1:朝当前页面所在的地址提交
方式2:写后缀 /index/ 自动补全ip和port
方式3:写全称https://www.baidu.com
4.提交post请求前期需要去配置文件中注释一行代码
MIDDLEWARE = [
# 'django.middleware.csrf.CsrfViewMiddleware',
]
request对象方法
from django.http import HttpResponse
from django.shortcuts import render
# Create your views here.
def login(request):
'''该函数将来会通过不同的请求方式触发 并且需要执行不同的业务逻辑代码'''
# print(request.method)
if request.method == 'GET':
# 1.返回给前端一个页面,
return render(request, 'login.html')
elif request.method == 'POST':
print(request.POST) # <QueryDict: {'username': ['Jason'], 'password': ['123']}>
res = request.POST.get('username')
print(res, type(res)) # 如果一个列表中有多个数据的时候,返回的是最后一个数据 kerry <class 'str'>
# Jason <class 'str'>
'''
虽然看起来是一个列表,但是我们获取到的是一个字符串
[31/Aug/2022 18:50:51] "GET /login/ HTTP/1.1" 200 1152
[31/Aug/2022 18:51:05] "POST /login/ HTTP/1.1" 200 9
<QueryDict: {'username': ['Jason', 'tony', 'kerry'], 'password': ['123']}>
kerry <class 'str'>
如果一个列表中有多个数据的时候,返回的是最后一个数据
'''
res1 = request.POST.getlist('username') # 如果你想那那个键对应的所有的值,就可以使用另一个方法,getlist
print(request.GET) # 只要在网址后面加的数据,无论发什么请求,都可以通过request.GET拿到这个数据
return HttpResponse('收到了')
'''
[31/Aug/2022 18:35:10] "GET /login/ HTTP/1.1" 200 966
<QueryDict: {'username': ['Jason'], 'password': ['123']}>
:知识点小插曲:
在写表单的时候,我们会写一个name的属性,如果不写的话就不会获取到它的数据
[31/Aug/2022 18:35:19] "POST /login/ HTTP/1.1" 200 9
'''
request.method 获取请求方式 结果是纯大写的字符串
request.POST 获取POST请求发送来的普通数据(不包含文件)
request.POST.get() 默认只获取列表中最后一个数据值
request.POST.getlist() 获取键对应的整个列表 无论有几个数据值
request.GET 获取url后面携带的非敏感数据
request.GET.get() 默认只获取列表中最后一个数据值
request.GET.getlist() 获取键对应的整个列表 无论有几个数据值
pycharm连接MySQL
1.查找pycharm提供的database按钮
右侧边栏或者左下角有一个数据据的小图标
如果没有的话就去下载
Files--->settings--->plugins,然后搜索Database Tools and sql
下载安装驱动
连接已有的数据库
添加新的数据
一些常用的功能
2.首次链接数据库需要下载对应的驱动
django链接MySQL
django默认使用的是sqlite3 但是这款数据库一般只用于本地测试 功能较少
1.配置文件中修改配置
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql', # 指定数据库软件名称
'NAME': 'day55', # 指定库名
'USER': 'root',
'PASSWORD': '123456',
'HOST': '127.0.0.1',
'PORT': 3306,
'CHARSET': 'utf8'
}
}
2.报错处理
1.django.core.exceptions.ImproperlyConfigured: Error loading MySQLdb module.
Did you install mysqlclient?
在__init__.py中添加下面俩句话
import pymysql
pymysql.install_as_MySQLdb()
2.AttributeError: 'str' object has no attribute 'decode'
3.指定链接MySQL的模块
django1.11 版本需要在项目或者应用目录下的__init__.py中编写一行代码
import pymysql
pymysql.install_as_MySQLdb()
django2.2 以上版本需要使用mysqlclient模块,不需要在__init.py文件中添加那俩句代码
django orm
ORM:对象关系映射
类 映射成 表
对象 映射成 记录
对象点属性 映射成 字段对应的值
"""
ORM的存在可以让不会MySQL的python程序员 使用python的语法简单快捷的操作MySQL
"""
``
from django.db import models
# Create your models here.
class User(models.Model): # 类似于定义了表名
# 原生sql语句,id int primary key auto_increment
id = models.AutoField(primary_key=True) # 类似定义了主键
# 原生sql语句,name varchar(32)
name = models.CharField(max_length=32) # 定义了一个name字段
# 原生sql语句,pwd int
pwd = models.IntegerField() # 类似于定义了一个pwd的整形字段
2.数据库迁移/同步命令
1.将models中有关数据库的操作记录下来(migrations文件夹)
python38 manage.py makemigrations
2.将操作真正影响到数据库中
python38 manage.py migrate
'''当修改了models中与数据库相关的代码 都必须执行上述的命令'''
ps:可以简写 也可以指定应用单独迁移/同步
在终端输入python38 manage.py makemigrations,会在在migrations文件夹中出现一个0001——initial.py文件,里面会记录我们想要创价的模型
# Generated by Django 2.2.22 on 2022-08-31 12:23
from django.db import migrations, models
class Migration(migrations.Migration):
initial = True
dependencies = [
]
operations = [
migrations.CreateModel(
name='User',
fields=[
('id', models.AutoField(primary_key=True, serialize=False)),
('name', models.CharField(max_length=32)),
('pwd', models.IntegerField()),
],
),
]
python38 manage.py migrate
django会嵌入很多的应用,一个应用就是一个具体的业务逻辑,可能会出现不同的应用应用相同的表名,不同的应用建立了相同的表名,那么此时的orm直接将我们建立的模型名作为表明的话就会发生冲突,所以它自动加了一个前缀
3.orm会自动添加一个id的主键
表的主键在orm中 可以不写 orm会自动帮你添加一个id的主键,如果你需要主键的名称不叫id 只能自己创建
orm语法
1.查
models.User.objects.filter() 结果可以看成是一个列表套数据对象
如何获取对象 可以使用first()方法 如果没有值会返回None 我们if判断即可
2.增
models.User.objects.create()
3.改
models.User.objects.filter(id=1).update(name='jasonNB')
4.删
models.User.objects.filter(id=4).delete()
from django.http import HttpResponse
from django.shortcuts import render
from app01 import models
# Create your views here.
def login(request):
if request.method == 'POST':
username = request.POST.get('username')
password = request.POST.get('password')
# 删除数据
# models.User.objects.filter(id=5).delete()
# 修改数据
# models.User.objects.filter(id=1).update(name='jasonNB')
# 增加数据
# models.User.objects.create(name=username,pwd=password)
# 查询表数据
# select * from user where name='' and pwd=''
# user_obj = models.User.objects.filter(name=username, pwd=password).first()
# print(res) # <QuerySet [<User: User object (1)>]> 列表套数据对象
# user_obj = res[0]
# if user_obj:
# print(user_obj.id) # 1
# print(user_obj.name) # jason
# print(user_obj.pwd) # 123
# return HttpResponse('登录成功')
# return HttpResponse("用户名或密码错误")
return render(request, 'login.html')
标签:文件,models,request,Django2,django,static,数据
From: https://www.cnblogs.com/zjl248/p/16969752.html