# 启动django项目之后,我们如何添加更多的功能
只要先添加功能,就去urls.py 和 view.py中添加对应和功能函数
# django自带重启功能
当识别到项目中代码有变化之后,间隔一段时间之后就会自动重启,但会有点慢
# 与浏览器打交道的视图函数都应该有返回值
HttpResponse
主要用于返回字符串类型的数据
return HttpResponse
render
主要用于返回html文件,并且支持模板语法(django语法)
return render(request, 'index文件.html', {'name': 'gavin'})
redirect
主要用于重定向,括号内的可以写其他网站的全称,也可以写自己网站的后缀
"""
我们之所以可以在浏览器地址栏中输入不同的路由访问到不同的资源 是因为我们在后端框架中提前开设了相应的访问接口所以用户才能访问
言外之意就是我们没有开设接口 那么肯定访问不到
"""
# 1.开设接口返回登录界面
# 2.登录界面需要使用bootstrap并且还需要自己编写css和js
静态文件
# 页面需要获取前端用户数据并传递给后端
form表单
action参数: 控制数据的提交地址
method参数: 控制请求的提交方式
# 访问登录页面
静态文件全部显示资源不存在
http://127.0.0.1:8000/static/bootstrap-3.3.7-dist/css/bootstrap.min.css
就是因为我们没有开设惊涛资源的访问端口
# 开设静态资源的访问接口
理论上是自己去路由层开设接口资源,但是由于静态文件资源使用频率很高
因为只要是一个web项目肯定需要开设,使用提供了静态资源的配置文件,只要填写固定的配置就可以开设资源接口
settings.py文件中,最下方
# 静态文件资源访问接口固定配置
STATICFILES_DIRS = [
os.path.join(BASE_DIR, 'static')
]
# html页面路径
/static/mycss.css
# 配置文件的两大疑惑
STATIC_URL = '/static/' # 作用
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中的
"""
# 接口前缀动态绑定
如果templates中有很多html文件并且都需要引入静态资源
当你把接口的前缀修改之后页面就无法加载资源,使用我们进行动态的接口前缀绑定
{% load static %}
<link rel="stylesheet" href="{% static 'bootstrap-3.3.7-dist/css/bootstrap.min.css' %}">
# 编写完成后不会经常使用或被修改的与html页面相关的文件
css文件、js文件、图片文件、第三方框架文件(bootstarp)
这些都可以称之为静态文件
我们在django中静态文件单独开设一个文件夹存储,默认为static文件夹
在这个文件夹内还可以根据功能的不同继续划分不同的文件
css文件夹、js文件夹、img文件夹 、others文件夹
"""
提交post请求,默认时会报403
前期我们直接去配置文件中注释一行即可
MIDDLEWARE = [
'django.middleware.csrf.CsrfViewMiddleware',
]
注释这一行
"""
1、get请求和post请求都会触发同一个视图函数login的运行
# 如何针对不同的请求执行不同的代码
get请求返回一个登录页面
post请求获取用户数据并校验
2、获取当前请求方式
request.method 返回的是纯大写的请求方法字符串
"""
由于get请求更加常见,post请求其次,所以还可以简写
"""
"""默认让视图函数处理get请求 ,当为post时走post"""
if request.method == 'POST':
return HttpResponse('欢迎来到米奇妙妙屋')
return render(request, 'login.html')
3、获取post请求提交的普通数据
request.POST # 结果为 <QueryDict: {'username': ['owen'], 'password': ['123']}> 所以我们看成字典处理
# 我们可以根据字典的取值方式拿到值
print(request.POST.get('hobby')) # 返回的列表,直接get会自动拿到最后一个值 333
print(request.POST.getlist('hobby')) # 先要拿到整个列表使用getlist ['111', '222', '333']
4、如何获取URL后面携带的数据
print(request.GET) #<QueryDict: {'info': ['111']}>
print(request.GET.get('info'))
print(request.GET.getlist('city'))
特征与上述request.POST一致 使用场景也很多
https://www.lagou.com/wn/jobs?kd=python&isSchoolJob=1&city=%E4%B8%8A%E6%B5%B7&pn=1
"""
pycharm也可以充当很多数据库软件的客户端
"""
1、pycharm左上方侧边 database
2、pycharm左下方边 database
3、这两个地方都没有时,我们就需要下载插件,或者重新安装一个正常pycharm
settings
plugins
搜索database下载apple即可
# 链接数据库
1、选择数据库
2、首次链接需要下载驱动
download drive..
3、测试链接如果不通过,则需要换驱动重新下载使用
Driver:MySQL MySQL for 5.1
"""
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': 'lsw03',
'HOST': '127.0.0.1',
'PORT': 3306,
'USER': 'root',
'PASSWORD': '123456',
}
# 3、指定模块 django 1.x 独有的
在项目同名的文件夹内的__init__.py
或者应用名的文件夹内的__init__.py
添加一行固定的代码
import pymysql
pymysql.install_as_MySQLdb()
ORM:对象关系映射
# 特点
能够让不会写SQL的python程序员使用Python语法就可以直接操作mysql
开发效率等得到提高
坏处: 封装了SQL语句,有时候效率不高还需要人为编写SQL调用
# 概念
表 ———— 类
一行行数据 ———— 类产生的一个个对象
数据字段 ———— 对象的一个个属性
# 如果需要使用ORM 需要去使用应用下的models.py中编写代码
1、编写类代码,创建一个表
class Users(models.Model):
uid = models.AutoField(primary_key=True) # AutoField 在自动创建主键 相等于 uid int primary key auto_increment
name = models.CharField(max_length=32) # 字段 等价于name varchar(32)
pwd = models.IntegerField() # 相当于 pwd int
2、执行数据库迁移命令
# 使用pycharm打开cmd
python38 manage.py makemigrations # 记录操作
python38 manage.py migrate # 将操作迁移到数据库
"""
首次执行迁移命令 django还会自动创建一些默认需要使用到的表
"""
3、表名的特征
users app01_users
由于django支持多个应用 ,所以为了区分不同应用下可能会出现相同的表名 ,所以自动加上了应用的前缀,这样就会在一个人应用里面出现相同的表名
4、扩展
4.1、表的主键可以不写,orm会自动帮你写一个名为ID的主键
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
4.2、每次修改了跟数据局库相关的Python代码,都需要重新执行迁移命令
针对两个迁移的命令,可以采用pycharm提示功能编写
tools
run manage.py task
# 增
from app01 import models
user_obj = models.Users.objects.create(name='gavin', pwd='123')
print(user_obj) # Users object
print(user_obj.uid) # 3
print(user_obj.name) # gavin
print(user_obj.pwd) # 123
# 查
res = models.Users.objects.filter(name='owen')
print(res) # <QuerySet [<Users: Users object>]>
print(res[0]) # 对象
print(res[0].uid) # 1
print(res[0].name) # owen
print(res[0].pwd) # 123
# 改
models.Users.objects.filter(uid=2).update(name='gavinYYDS')
# 2 | gavinYYDS | 123 |
# 删
models.Users.objects.filter(uid=3).delete()