今日学习目标
- 了解Django基础设置操作
文章目录
学习内容
- django小白必会三板斧
- 静态文件及相关配置
- request对象方法
- pycharm链接MySQL
- django链接MySQL
- django orm操作
一、django小白必会三板斧
与浏览器打交道的视图函数都应该有返回值 常见的就是下列三个
- HttpResponse
主要用于返回字符串类型的数据
def index(request):
return HttpResponse('hello world')
- render
主要用于返回html文件 并且支持模板语法(django自己写的)
def ab_render(request):
# 视图函数必须要接受一个形参request
user_dict = {'username':'jason','age':18}
# 第一种传值方式:更加的精确 节省资源
# return render(request,'01 ab_render.html',{'data':user_dict,'date':123})
# 第二种传值方式:当你要传的数据特别多的时候
"""locals会将所在的名称空间中所有的名字全部传递给html页面"""
return render(request,'01 ab_render.html',locals())
- redirect
主要用于重定向 括号内可以写其他网站的全称 也可以自己网站的后缀
def index(request):
return redirect('https://www.baidu.com')
二、 静态文件及相关配置
- 引言
既然已经了解了Django的基础使用,那么接下来就以实际案例引出什么是静态文件以及它的相关配置
我们之所以可以在浏览器地址栏中输入不同的路由访问到不同的资源
是因为我们在后端框架中提前开设了相应的访问接口所以用户才能访问
言外之意就是我们没有开设接口 那么肯定访问不到
- 需求
利用Django框架去编写一个简单的登录界面 - 1.开设接口返回登录界面
- 2.登录界面需要使用bootstrap并且还需要自己编写css和js
编写完成后不会经常被修改的与html页面相关的文件
此时这些就是
静态文件 - 3.页面需要获取前端用户数据并且传递给后端
form表单
action参数:控制数据的提交地址
method参数:控制请求的提交方式 - 4.访问登录页面
静态文件全部显示资源不存在
http://127.0.0.1:8000/static/bootstrap-3.3.7-dist/css/bootstrap.min.css
因为我们并没有开设静态资源访问的接口 - 5.开设静态资源的访问接口
理论上应该自己去路由层开设接口资源 但是由于静态文件资源使用频率很高
只要是一个web项目都肯定需要 所以django为了避免开发者繁琐 提供了静态资源的配置文件 只需要填写固定的配置即可开设资源接口
settings.py
# 静态文件资源访问接口固定配置
STATIC_URL = '/static/'
STATICFILES_DIRS = [
os.path.join(BASE_DIR, 'static')
]
# html页面路径
/static/mycss.css
-
6.配置文件中的两点疑惑
1.STATIC_URL = '/static/' # 作用是什么 2.STATICFILES_DIRS = [] # 为什么是列表(用来存储多个元素的)
以该地址为例:/static/bootstrap-3.3.7-dist/css/bootstrap.min.css
/static/是接口前缀 表示具备访问静态文件资源的权限
具备了权限之后会拿着接口前缀后面的文件路径去列表中每个文件夹中查找
bootstrap-3.3.7-dist/css/bootstrap.min.css
找到一个就结束
比如 static和static1里面都有a.txt 那么只会拿到static中的 -
7.接口前缀动态绑定
如果templates中有很多html文件并且都需要引入静态资源
现在把接口前缀修改了 那么会造成:页面无法加载资源{% load static %} <link rel="stylesheet" href="{% static 'bootstrap-3.3.7-dist/css/bootstrap.min.css' %}">
补充说明
css文件、js文件、图片文件、第三方框架文件(bootstrap)
上述文件都可以称之为是'静态文件'
在django中静态文件单独开设一个文件夹存储 默认叫static文件夹
在该文件夹内还可以根据功能的不同继续划分不同的文件
css文件夹 js文件 img文件夹 others文件夹
三、 request对象方法(部分)
“”"
提交post请求 默认会报403
前期不需要过多考虑 直接去配置文件中注释一行即可
MIDDLEWARE = [
# ‘django.middleware.csrf.CsrfViewMiddleware’,
]
“”"
前面提到的项目中提到了前后端数据交互,这时就要回顾一下在前端和网络编程学习中提到的两种方式了:
-
get请求和post请求都会触发同一个视图函数login的运行
如何针对不同的请求执行不同的代码:
比如:
get请求返回一个登录页面
post请求获取用户数据并校验 -
获取当前请求方式
request.method 返回的是纯大写的请求方法字符串
补充:由于get请求更加常见 post请求次之 所以还可以按照下列方式简写
if request.method == 'POST':
return HttpResponse('默默的奋斗才是王道 有了成就才有发言权')
"""默认让视图函数处理get请求"""
return render(request, 'login.html')
- 获取post请求提交的普通数据
request.POST 结果是一个QueryDict 可以看成字典处理
request.POST.get('username')
request.POST.getlist('hobby')
"""
get方法会拿到值列表中最后一个元素 而不是整个列表
getlist方法会直接拿到整个值列表
"""
- 如何获取url后面携带的数据
request.GET 结果是一个QueryDict 可以看成字典处理
request.GET.get('info')
request.GET.getlist('cityList')
"""
特征与上述request.POST一致 使用场景也很多
"""
四、 pycharm链接MySQL
步骤:
1.pycharm右上方侧边 database
2.pycharm左下方边角 database
3.上述两个地方都没有 需要下载插件 或者直接重装一个正常的pycharm
settings
plugins
搜索database下载apple即可
链接数据库
1.选择数据库
2.首次链接需要下载驱动
download driver…
3.测试链接如果不通过 则需要换驱动重新下载使用
Driver:MySQL MySQL for 5.1
详细的操作可以参考图文操作教程
五、 django链接MySQL
- 补充:
django默认自带一个sqlite3数据库 但是功能很少 仅用于本地测试
- 默认配置
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
}
}
- 修改配置
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'jp_05',
'HOST': '127.0.0.1',
'PORT': 3306,
'USER': 'root',
'PASSWORD': 'jason123',
}
}
- 指定模块
注意:Django1.x默认的还是使用MySQLdb:执行会报:ImportError: No module named ‘MySQLdb’
报错:django migrate django.db.utils.InternalError:,一般是数据库编码不为utf8导致
在项目同名的文件夹内的__init__.py
或者应用名的文件夹内的__init__.py
添加一行固定的代码
import pymysql
pymysql.install_as_MySQLdb()
六、 django orm操作
django orm简介
ORM:对象关系映射
ORM解决的主要问题是对象和关系的映射。它通常把一个类和一个表一一对应,类的每个实例对应表中的一条记录,类的每个属性对应表中的每个字段。
- 特点
能够让不会写SQL的python程序员使用python语法就可以直接操作MySQL
好处:提升了开发效率…
坏处:封装了SQL语句 有时候可能效率不高 还需要人为编写SQL调优 - 概念
表 类
一行行数据 类产生的一个个对象
数据字段 对象的一个个属性
更多了解请前往官方文档
orm基本使用
如果需要使用ORM 需要去应用下的models.py中编写代码
- 编写类代码
class Users(models.Model):
uid = models.AutoField(primary_key=True) # 等价于uid int primary key auto_increment
name = models.CharField(max_length=32) # 等价于name varchar(32)
pwd = models.IntegerField() # 等价于pwd int
-
执行数据库迁移命令
python3 manage.py makemigrations # 将models.py文件中的改动记录在(app/migrations/00xx_****.py)上 python3 manage.py migrate # 将改动翻译成SQL语句,去数据库中执行
首次执行迁移命令 django还会自动创建一些默认需要使用到的表
-
表名的特征
Users app01_users
由于django支持多个应用 为了区分不同应用下可能会出现相同的表名
所以自动加上了应用的前缀 因为同一个应用下不可能出现相同的表名(只要你是个正常的程序员都不会犯这样的错误) -
扩展
1.表的主键可以不写 orm会自动帮你写一个名为id的主键
2.每次修改了跟数据库相关的python代码 都需要重新执行迁移命令
针对两个迁移命令 可以采用pycharm提示功能编写
tools
run manage.py task
数据操作
创建一个学生表
class Student(models.Model):
name = models.CharField(max_length=20)
gender = models.BooleanField(default=True)
age = models.IntegerField(default=0)
content = models.TextField(max_length=200)
email = models.EmailField()
单表基础操作
# 增
models.Student.objects.create(name='学生A', gender=False, age=122, content='学习优异', email='studentA@qq.com')
student_obj = models.Student(name='学生B', gender=True, age=13, content='学习良好', email='studentB@qq.com')
student_obj.save()
# 批量增加数据
student_objs = [models.Student(name='学生', gender=True, age=11, content="学生的描述") for i in range(10)]
models.Student.objects.bulk_create(student_objs)
# 删
models.Student.objects.get(id=1).delete()
# 改
obj = models.Student.objects.get(name='学生A')
obj.name = '学生AAA'
obj.save()
# 查
# all():查询所有结果;QuerySet
student_all = models.Student.objects.all()
# filter(**kwargs):查询条件匹配的对象;QuerySet
student_list = models.Student.objects.filter(name='学生B')