django小白必会三板斧
简要说明
# 启动django项目之后 如何添加更多的功能 回想自己编写的web框架 如果要添加功能 就去urls.py和views.py # django自带重启功能 当识别到项目中代码有变化之后 隔段时间会自动重启 但是有时候较慢
三板斧
# 与浏览器打交道的视图函数都应该有返回值 常见的就是下列三个 HttpResponse 主要用于返回字符串类型的数据 render 主要用于返回html文件 并且支持模板语法(django自己写的) redirect 主要用于重定向 括号内可以写其他网站的全称 也可以自己网站的后缀
登录功能
我们之所以可以在浏览器地址栏中输入不同的路由访问到不同的资源 是因为我们在后端框架中提前开设了相应的访问接口所以用户才能访问 言外之意就是我们没有开设接口 那么肯定访问不到 # 1.开设接口返回登录界面 # 2.登录界面需要使用bootstrap并且还需要自己编写css和js 静态文件 # 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 # 静态文件资源访问接口固定配置 STATICFILES_DIRS = [ os.path.join(BASE_DIR, 'static') ] # html页面路径 /static/mycss.css
# 6.配置文件中的两点疑惑 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中的 # 7.接口前缀动态绑定 如果templates中有很多html文件并且都需要引入静态资源 现在把接口前缀修改了 那么会造成什么结果???:页面无法加载资源 {% load static %} <link rel=stylesheet href={% static 'bootstrap-3.3.7-dist/css/bootstrap.min.css' %}>
静态文件
# 编写完成后不会经常被修改的与html页面相关的文件 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 可以看成字典处理 # QueryDict: {'username': ['tuzi'], 'password': ['123']} request.POST.get('username') # 可以直接拿到元素 request.POST.getlist('hobby') # 可以拿到整个列表 get方法会拿到值列表中最后一个元素 而不是整个列表 getlist方法会直接拿到整个值列表
如何获取url后面携带的数据
request.GET 结果是一个QueryDict 可以看成字典处理 request.GET.get('info') request.GET.getlist('cityList') 特征与上述request.POST一致 使用场景也很多 https://www.lagou.com/wn/jobs?kd=python&isSchoolJob=1&city=%E4%B8%8A%E6%B5%B7&pn=1
pycharm链接MySQL
其实pycharm也可以充当很多数据库软件的客户端 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数据库 但是功能很少 仅用于本地测试 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': 'jp_05', 'HOST': '127.0.0.1', 'PORT': 3306, 'USER': 'root', 'PASSWORD': 'jason123', } } 3.指定模块 在项目同名的文件夹内的__init__.py 或者应用名的文件夹内的__init__.py 添加一行固定的代码 import pymysql pymysql.install_as_MySQLdb()
django orm简介
ORM:对象关系映射 # 特点 能够让不会写SQL的python程序员使用python语法就可以直接操作MySQL 好处:提升了开发效率... 坏处:封装了SQL语句 有时候可能效率不高 还需要人为编写SQL调优 # 概念 表 类 一行行数据 类产生的一个个对象 数据字段 对象的一个个属性
orm基本使用
# 如果需要使用ORM 需要去应用下的models.py中编写代码 1.编写类代码 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 2.执行数据库迁移命令 python3 manage.py makemigrations # 记录操作 python3 manage.py migrate # 将操作迁移到数据库 首次执行迁移命令 django还会自动创建一些默认需要使用到的表 3.表名的特征 Users app01_users 由于django支持多个应用 为了区分不同应用下可能会出现相同的表名 所以自动加上了应用的前缀 因为同一个应用下不可能出现相同的表名(只要你是个正常的程序员都不会犯这样的错误) 4.扩展 1.表的主键可以不写 orm会自动帮你写一个名为id的主键 2.每次修改了跟数据库相关的python代码 都需要重新执行迁移命令 针对两个迁移命令 可以采用pycharm提示功能编写 tools run manage.py task
数据操作
增
user_obj = models.Users.objects.create(name='jack', pwd='333') print(user_obj) print(user_obj.uid) print(user_obj.name) print(user_obj.pwd)
查
res = models.Users.objects.filter(name='jason') print(res) # <QuerySet [<Users: Users object>]> print(res[0]) # Users object print(res[0].uid) # 1 print(res[0].name) # jason print(res[0].pwd) # 123
改
models.Users.objects.filter(uid=1).update(name='jasonNB')
删
models.Users.objects.filter(uid=3).delete()