Django简介、安装、配置、迁移命令
一、Django简介
django安装
版本问题
1.X 2.X
统一制定1.11.11
安装
pip3 install django==1.11.11
测试
django-admin
wsgiref模块
wsgiref模块能根据功能的不同拆分成不同的文件,用户在浏览器窗口输入url之所以能狗获取到相应的资源,是因为后端早已经开设了相应 资源接口。
wsgiref特点:
- 先在urls文件中写url与函数的对应关系
- 再去views文件中写对应的函数功能块
urls.py:路由与属性函数的对应关系
views.py:里面就是放的一堆视图函数(视图函数也可以是函数也可以是类)
templates文件夹:里面放的就是一堆HTML文件(模板文件夹)
大白话:wsgiref模块作用是帮你将复杂的socket连接封装,将用户输入的数据做处理,并把后端发送给浏览器的数据也做处理。
from wsgiref.simple_server import make_server
动静态网页
静态网页
数据是写死的,万年不变
动态网页
数据是动态获取的:
- 获取档期那时间
- 从数据库中获取数据
jinja2模块
提供了一个可以在HTML页面上书写类似于python后端的 代码,来操作数据(模板语法)
pip3 install jinja2 下载安装模块
flask框架模板语法使用的就是jinja2模块,所以只要下载了flask框架,就会自动下载jinja2模块。
模板语法(jinja2)模块语法非常贴近python语法,但是并不是所有的框架使用的都是jinja2模块语法
模板语法
{{}} 变量相关
{%%} 逻辑相关
在HTML文件内的语法示例:
{{ xxx }}
<p>{{xxx.username}}</p>
<p>{{xxx['password']}}</p>
<p>{{xxx.get('hobby')}}</p>
<p>{{xxx.get('hobby')[0]}}</p>
<p>{{xxx.get('hobby').1}}</p>
{%for user_dict in xxx %}
<tr>
<td>{{ user_dict.id }}</td>
<td>{{ user_dict.name }}</td>
<td>{{ user_dict.hobby }}</td>
</tr>
{% endfor %}
web框架
A:socket
B:路由分发
C:模板渲染
django
A:用的别人的 wsgiref
B:自己写的
C:自己写的
flask
A:用的被人的 werkzeug
B:自己写的
C:用的别人的 jinja2
tornado
A,B,C都是自己的。追求速度
python三大主流框架
django
- 优点:大而全,自身携带的组件和功能特别特别多,功能全面;就类似于塔吊机
- 缺点:大嘛,所以就笨重,需要的不需要的功能都有。当你只需要盖一间房子的时候,你会用到塔吊机嘛?
flask
- 优点:小而精,源码600多行(分为请求上下文,应用上下文),自身携带的组件和功能特别特别少,但是第三方支持该框架的模块特别特别多,如果你将flask第三方模块全部叠加起来,甚至可以超过django
- 缺点:常言你的优点就是你的缺点。因此flask受限于第三方模块,版本更新导致不兼容问题比较常见。
tornado
异步非阻塞,天然支持高并发,甚至可以用它来开发游戏服务器。
django框架
安装及注意事项
-
注意事项
- 计算机名称不能有中文
- 项目文件名也不能用中文
- 一个pycharm窗口就是一个单独的完整的项目
-
版本问题
-
-
1.x版本
-
2.x版本
-
3.x版本(目前不用考虑)
推荐使用1.x版本里面的1.11.09-1.11.13,因为2.x版本才发行不久,新公司或者更换了版本的公司才会使用,一般使用1.8或1.11,现已逐步往1.11转
-
-
安装
pip3 install django==1.11.11
-
测试是否安装成功
命令行输入:django-admin
创建django项目
-
命令行
-
创建django项目
语法:django-admin startproject mysite(项目名)
效果:创建一个mysite文件夹
-
启动django项目(先切换到项目目录下)
语法:python manage.py runserver 必须在cmd管理员启动(django默认端口是8000)
-
创建具有独立功能的app,通常情况下应该能做到见明之义。
语法:python manage.py startapp app名字
在Django项目中创建好app之后一定要去settings.py注册才有效
注意:
1.使用命令行创建的django项目是不会自动创建templates模板文件夹的,只能自己手动创建
2.命令行创建的django项目不但没有templates文件夹,配置文件中也没有填写路径(而pycharm创建会自动添加)
-
app的概念
全名application 应用,此app非彼app.
django其实是一个专注于开发app的web框架,一个空的django项目就类似于一所大学,app就类似于大学里面的各个学院。
每个app就类似于不同的功能模块
- 购物网站
-
- 用户相关 user ---用户相关的app
- 订单相关 order --- 订单相关的app
- 投诉相关 Complaint --- 投诉相关的app
- 不同的功能模块推荐使用不同的app去开发
- django支持多app
注册APP
django主要文件功能
mysite
-mysite
--__init__.py
--settings.py 项目配置文件
--urls.py 路由视图函数对应关系,项目的总路由
--wsgi.py
-manage.py
app01
--migrations文件夹 数据库改动记录
----__init__.py
--__init__.py
--admin.py django后台管理
--apps.py 注册app类
--models.py 模型类(orm)
--tests.py 测试文件
--view.py 视图函数(******)
db.sqlite3 django自带的一个小型用于本地测试的数据库(对日期格式的数据不是很敏感)
使用django时注意的事项
1.代码修改了始终没有效果:
1.在同一个端口起了多个服务 一直跑的是最开始的那个服务
2.浏览器缓存问题
2.创建app之后一定一定要先去setting文件中注册
1.django能够自动重启 但是它的重启机制
2.只要检测到你的代码有变化 在一定的时间间隔内就会自动重启
3.所以有时候可能会出现 你代码还没写完 就已经自动重启了
1.python解释器不要用3.7及以上版本
2.计算机名称不能有中文
3.文件名称也尽量不要用中文
4.一个pycharm窗口就跑一个django项目
django小白必会三板斧
1.HttpResponse 返回字符串
return HttpResponse('字符串')
2.render 返回html页面
return render(request,'templates文件夹下的html文件名',{'xxx':'hello world'})
页面上就可以通过{{xxx}}拿到hello world
模板的渲染(将数据在后端按照模板语法放入html对应的位置)
3.redirect 重定向
return redirect(url) # url可以是别人网站的全路径 也可以是自己网站的url后缀
return redirect('/index')
return redirect('https://www.mzitu.com')
二、静态文件配置
什么是静态文件
网站所使用到的提前已经写好了的文件
eg:
css
js
第三方的组件
bootstrap
sweetalert
fontawesome
网站所用到的html文件统一放到templates文件夹中
那针对网站所使用到的静态文件也应该单独找一个文件夹来存储
三、存放静态文件的文件夹
这个文件夹 默认情况下都叫static,需要手动自己创建
static
-css
网站所用到的所有的css文件
-js
网站所用到的所有的js文件
-image
网站所用到的所有的图片文件
第三方文件
四、Django配置静态文件
1.在settings.py中配置文件
STATIC_URL = '/static/'
STATICFILES_DIRS = [
os.path.join(BASE_DIR, 'static'),
os.path.join(BASE_DIR, 'static1'),
os.path.join(BASE_DIR, 'static2')
]
当你的接口前缀正确之后 会拿着后面的路径依次去下面列表中的每一个文件夹下查找对应的资源
顺序是从上往下依次查找 如果都没有找到才会报错
这里的static是文件夹路径
那么问题来了,如果STATIC_URL要修改,其余的全部文件都要修改,及其不方便。我们怎么办呢?
我们可以想办法动态绑定,让STATIC_URL无论怎么改变,对应的href前缀跟着改变就解决了。
2.动态绑定
{% load static %} //类似于import导入
<link rel="stylesheet" href="{% static 'bootstrap-3.3.7-dist/css/bootstrap.min.css' %}">
<script src="{% static 'bootstrap-3.3.7-dist/js/bootstrap.min.js' %}"></script>
3.前期403注释
五、form表单
form表单默认是以get请求提交数据的
http://127.0.0.1:8000/login/?username=admin&password=123
action
1.不写 默认朝当前地址提交数据
2.全路径
3.后缀(/index)
六、获取前端的请求方式
request.method # 结果是一个纯大写的字符串 GET/POST
request.POST # 获取post请求提交的数据 类似于是一个大字典
# <QueryDict: {'username': ['admin', 'jason'], 'password': ['123']}>
get方法:针对只有一个值,用户名、密码
request.POST.get() # 只会取列表最后一个元素
request.POST.getlist() # 取出整个列表,针对对选框、多个值操作
通常情况这样写:
POST请求类似于一个大字典
七、pycharm连接MySQL
需要你自己提前创建好对应的库
1.先去配置文件中配置相关参数
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql', # 数据库类别
'NAME': 'jeff', # 库的名字
'HOST':'127.0.0.1',
'PORT':3306,
'USER':'root',
'password':'123',
'CHARSET':'utf8'
}
}
2.在项目名或者应用名下面的__init__文件中告诉django使用pymysql链接数据库而不是用默认的mysqldb
import pymysql
pymysql.install_as_MySQLdb()
八、django orm简介
django orm不会帮你创建库 只能帮你自动创建表
orm对象关系映射
类 表
对象 记录
属性 字段值
作用:能够让一个不会数据库操作的小白也能够通过Python面向对象语法 句点符来简单快捷的操作数据
1.模型类
首先需要先去对应的应用下的models.py中书写你的模型类
对于主键id,django orm会自动帮你创建一个名字为id的主键字段。当检测到你创建了主键,那么会使用你自己创建的。如果没有那么会自动帮你创建。
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)
password = models.IntegerField() // password int
2.数据库迁移命令,逆向迁移
1.python3 manage.py makemigrations # 仅仅是将你对数据库的改动记录到某个小本本上(migrations文件夹)
2.python3 manage.py migrate # 将改动真正的同步到数据库中
"""
上面两个命令永远是成对出现的 只要你执行了1 就必须要执行2
"""
*******只要你动了models.py跟数据库相关的代码 你就必须要重新执行上面的两条命令来保证数据库与models.py一致***********
3.逆向数据库到模型
python manage.py inspectdb > app名字/models.py
3.获取用户点击的Id,绑定id
对于增删改查都需要先获取用户选择修改的数据id。那么我们怎么获取呢?
第一步:把用户的id绑定到按钮标签上
我们可以拼接url:获取用户点击的标签id。绑定id
<a href="/edit_user/?edit_id={{ user_obj.id }}" class="btn btn-primary btn-xs">编辑</a>
第二步:获取绑定到url的用户id
4.字段的增删改查
字段的增
1.create()
user_obj = models.User.objects.create(name=username,password=password)
# 该方法有返回值 返回值就是当前被创建的对象本身
2.对象绑定方法
# 1 先生成一个User对象
user_obj = models.User(name=username,password=password)
# 2 调用对象的绑定方法
user_obj.save()
字段的查
1.filter() //类似于where
from app01 import models
res = models.User.objects.filter(username='jason') # select * from user where
# 返回的结果是一个列表 支持索引取值但是不支持负数并且不推荐使用 推荐你使用它给你封装好的方法
推荐(重):user_obj = res.first()
# filter方法条件不存在的时候 不会报错返回的是一个空列表
filter括号内直接放多个关键字参数 并且多个关键字参数之间是and关系
models.User.objects.filter(username='jason',password='123')
类似于sql语句:# select * from user where username='jason' and password='123';
2.查所有的数据
1.filter() 括号内不写拿所有
2.all() 拿所有
字段的改
# 方式1(推荐) 批量更新
models.User.objects.filter(id=edit_id).update(name=username,password=password)
# 方式2(了解)
# 1 先获取数据对象
edit_obj = models.User.objects.filter(id=edit_id).first()
# 2 再修改对象属性
edit_obj.name = username
edit_obj.password = password
# 3 调用对象的绑定方法保存
edit_obj.save()
删
models.User.objects.filter(id=delete_id).delete() # 将filter过滤出来的数据全部删除