django学习笔记
今日内容概要
- 静态文件及相关配置
- 请求方法
- request对象方法
- pycharm连接MySQL
- django连接MySQL
- django orm简介
- orm基本操作
今日内容详细
静态文件及相关配置
我们在访问django框架资源的使用之所以可以拿到数据是因为提前在urls.py文件中开设了相应的资源接口,如果访问不到资源那么就是没有开设相应的接口。
编写登录功能
思路:
1.创建django项目并创建一个app
2.在urls.py添加一组对应关系
3.在app的views.py中编写登录核心逻辑
4.利用三板斧与前端做交互
def login(request):
if request.method == 'POST':
username = request.POST.get('username')
password = request.POST.get('password')
user_obj = models.User.objects.filter(name=username,pwd=password).first()
if user_obj:
return HttpResponse('登录成功')
return HttpResponse("用户名或密码错误")
return render(request, 'login.html')
静态文件
登录界面需要使用bootstrap并且还有需要自己编写的css和js文件,文件多就需要分门别类管理,就需要知道一下什么是静态文件。
静态文件就是html页面上使用的不经常改变的资源。
第三方框架文件(bootstrap)、css文件、js文件、图片文件,上述文件都可以称之为是静态文件
针对静态文件资源一般都会放在static文件夹内,当static目录下出现了很多不同类型的静态文件资源,那么还可以分类管理
others文件夹
第三方框架文件
css文件夹
所有的css文件
js文件夹
所有的js文件
img文件夹
所有的img文件
相关配置
针对静态文件资源的访问也需要提前开设相应的接口
理论上应该自己去路由层开设接口资源,但是由于静态文件资源使用频率很高,只要是一个web项目都肯定需要,所以django为了避免开发者繁琐,提供了静态资源的配置文件,只需要填写固定的配置即可开设资源接口。
STATIC_URL = '/static/' # 作用是什么 /static/是访问静态资源的接口前缀
# 静态文件资源配置
STATICFILES_DIRS = [
os.path.join(BASE_DIR, 'static')
] # 为什么是列表(用来存储多个数据的) 这里的static是存储静态文件资源的文件夹名称
以该地址为例:/static/bootstrap-3.4.1-dist/css/bootstrap.min.css
1./static/是接口前缀,表示具备访问静态文件资源的权限
2.具备了权限之后会拿着接口前缀后面的文件路径(bootstrap-3.4.1-dist/css/bootstrap.min.css)去列表中每个文件夹中查找
3.去该路径下面找到一个就结束,比如 static和static1里面都有a.txt 那么只会拿到static中的
4.去该路径下面找完全部都没有就报错
动态配置:修改了接口前缀也能访问
{% load static %}
<link rel="stylesheet" href="{% static 'bootstrap-3.4.1-dist/css/bootstrap.min.css' %}">
请求方法
URL:统一资源定位符(网址)
GET请求
朝别人索要数据,也可以携带额外的数据
GET请求没有请求体(HTTP数据格式)
携带数据的方法:就是在URL后面加个?,把要添加的数据写在?后面。
url?xxx=yyy&zzz=ooo&aaa=bbb
上述携带数据的方式有两个限制
1.数据只能是一些无关紧要的非敏感数据
2.数据大小有限制,一般在2KB~4KB左右
POST请求
朝别人提交数据,也可以携带额外的数据
数据都是放在请求体中并且数据大小没有限制
页面需要获取前端用户数据并且传递给后端
思路:通过form表单传递数据。form表单默认的数据提交方式是get。
method = 'post' :控制请求的提交方式
action 参数:控制数据的提交地址
方式1:不写参数,就是朝当前页面所在的地址提交
方式2:写后缀,比如/index/,自动补全ip和port
方式3:写全称,比如https://www.baidu.com/
提交post请求前期需要去配置文件中注释一行代码
MIDDLEWARE = [# 'django.middleware.csrf.CsrfViewMiddleware',]
request对象方法
get请求和post请求都会触发同一个视图函数login的运行。
问题:如何针对不同的请求执行不同的代码?
思路:get请求返回一个登录页面,post请求获取用户数据并校验。
解决方式:
"""由于get请求更加常见 post请求次之 所以还可以按照下列方式简写"""
if request.method == 'POST':
return HttpResponse('POST请求返回的页面')
"""默认让视图函数处理get请求"""
return render(request, 'login.html')
方法 | 说明 |
---|---|
request.method | 获取请求方式,结果是纯大写的字符串 |
request.POST | 获取POST请求发送来的普通数据(不包含文件) |
request.POST.get() | 默认只获取列表中的最后一个数据值 |
request.POST.getlist() | 获取键对应的整个列表,无论有几个数据值 |
request.GET | 获取url后面携带的非敏感数据 |
request.GET.get() | 默认只获取列表中最后一个数据值 |
request.GET.getlist() | 获取键对应的整个列表,无论有几个数据值 |
pycharm连接MySQL
pycharm也可以充当很多数据库软件的客户端。
如何进入pycharm的数据库客户端:
- 查找pycharm提供的database按钮,pycharm右上方侧边,左下方边角
- 上述两个地方都没有 需要下载插件 或者直接重装一个正常的pycharm。
我们以mysql为例子。
第一步:选择mysql数据库。
第二步:输入用户名,密码和库名,测试连接(第一次需要下载驱动)
django链接MySQL
django默认自带一个sqlite3数据库,但是功能很少,仅用于本地测试。
1.默认配置
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
}
}
2.修改配置
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql', # 指定数据库软件名称
'NAME': 'db_django', # 指定库名
'HOST': '127.0.0.1', # 本机地址
'PORT': 3306, # 本机mysql端口
'USER': 'root', # 用户名
'PASSWORD': '123', # 密码
'CHARSET': 'utf8' # 编码
}
}
3.指定连接MySQL的模块
django1.11 版本需要在项目或者应用目录下的__ init__.py中编写一行代码
import pymysql
pymysql.install_as_MySQLdb()
django2.2 以上版本需要使用mysqlclient模块
django orm 简介
ORM:对象关系映射
好处:能够让不会写MySQL的python程序员使用python语法简单快捷的操作MySQL。
坏处:封装了SQL语句,有时候可能效率不高,还需要人为编写SQL提升效率。
概念对应关系
ORM | 映射 | MySQL |
---|---|---|
类 | 映射成 | 表 |
对象 | 映射成 | 记录 |
对象点属性 | 映射成 | 字段对应的值 |
orm基本使用
在应用目录下的models.py编写模型类
class user(models.Model): # 类似于定义了表名
id = models.AutoField(primary_key=True) # 类似于定义了主键
# id int primary key auto_increment
name = models.CharField(max_length=32) # 类似于定义了普通字段
# name varchar(32)
pwd = models.IntegerField() # 类似于定义了普通字段
# pwd int
数据库迁移/同步命令
1.将models中有关数据库的操作记录下来(migrations文件夹)
python38 manage.py makemigrations
2.将操作真正影响到数据库中
python38 manage.py migrate
'''
首次执行迁移命令 django还会自动创建一些默认需要使用到的表
当修改了models中与数据库相关的代码 都必须执行上述的命令
'''
ps:可以简写 也可以指定应用单独迁移/同步
补充
1.迁移数据命令生成的表面的特征是:应用名_类名。由于django支持多个应用,为了区分不同应用下可能会出现相同的表名。
2.表的主键在orm中可以不写,orm会自动帮你添加一个id的主键,如果你需要主键的名称不叫id只能自己创建。
3.每次修改了跟数据库相关的python代码,都需要重新执行迁移命令。
4.针对两个迁移命令,可以采用pycharm提示功能编写,在tools里的run manage.py task中编写命令即可。
orm基本操作
orm语法
如何获取对象?
可以使用first()方法,如果没有值会返回None,然后用if判断即可
1.查
models.User.objects.filter() # 结果可以看成是一个列表套数据对象
2.增
models.User.objects.create()
3.改
models.User.objects.filter(id=1).update(name='jasonNB')
4.删
models.User.objects.filter(id=4).delete()
'''改和删操作前需要先找到需要的操作的数据,如果不写就是默认操作所有数据'''
orm外键关联
MySQL
一对多
外键字段在多的一方
多对多
外键字段建在第三张关系表
一对一
外键字段建在查询频率较高的表中
ORM
一对多(关键字ForeignKey)
外键字段建在多的一方
publish = models.ForeignKey(to='Publish', on_delete=models.CASCADE)
多对多(关键字ManyToManyField)
外键字段可以直接写在某张表中,orm会自动帮你创建第三张表
authors = models.ManyToManyField(to='Authors')
一对一(关键字OneToOneField)
外键字段建在查询频率较高的表中
detail = models.OneToOneField(to='AuthorDetail',on_delete=models.CASCADE)
'''
on_delete=models.CASCADE 级联更新,级联删除
'''
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· DeepSeek 开源周回顾「GitHub 热点速览」
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了