Django框架入门
HTTP协议
-
四大特性
- 基于TCP/IP协议之上作用于应用层的协议
- 基于请求响应
- 无状态
- 无连接
-
请求响应的数据格式
-
请求格式
请求首行 请求头 请求体(在这个地方区分get请求与post请求;get请求无请求体)
-
响应格式
响应首行 响应头 响应体
-
-
状态码:
- 1XX:服务器已接收到请求正在处理,可以继续发送请求
- 2XX:响应成功 例如:200
- 3XX:一般为重定向 例如:304
- 4XX:请求错误 常见的有: 403(不满足请求条件,拒绝访问),404(资源不存在)
- 5XX:一般为服务器内部错误
动静态页面
并不是说页面“动”与“不动”的区别,而是页面与服务器有没有数据上的交互
Django返回的三板斧
- HttpResponse:返回字符串
- render:请求转发
- redirect:重定向
Django配置静态文件
通常情况下会将静态文件(js、css、图片、字体等)存放在 /static 文件夹下
在 settings.py 中添加STATICFILES_DIRS=[
os.path.join(BASE_DIR,'static')
]
这个时候你的静态文件就配置好了
在你的前端页面应用js或css的时候只要以 /static/ 开头就可以引用静态文件
或者是使用模板语言的方法来动态解析:
{% load static %}
<link rel="stylesheet" href="{% static 'bootstrap/css/bootstrap.min.css' %}">
<script src="{% static 'bootstrap/js/bootstrap.min.js' %}"></script>
都说Django是一个Web框架,那么我们就来剖析下Web框架为我们做了那些事情
-
与浏览器进行交互
import socket server = socket.socket() server.bind(('127.0.0.1', 8080)) server.listen(5) while True: con, addr = server.accept() data = con.recv(1024) # 接收客户端数据 print(data.decode()) # 打印客户端数据 con.send(b"HTTP/1.1 200 OK ") # 按照HTTP协议的格式响应 con.send(b"Hello World!") # 响应内容 con.close()
-
将html代码发送给客户端
import socket server = socket.socket() server.bind(('127.0.0.1', 8080)) server.listen(5) while True: con, addr = server.accept() data = con.recv(1024) print(data.decode()) con.send(b"HTTP/1.1 200 OK ") con.send(b""" <html> <head> <title>Title</title> </head> <body> <h1>Hello World!</h1> </body> </html> """) con.close()
有以上的两个功能(接收浏览器发来的数据,给浏览器发送数据)就可以说是一个最简单的Web服务器,就是这么简单。
安装django
pip install django
注意事项:
- 计算机名称不能有中文
- 项目名尽量不要有中文
使用命令行创建Django项目
-
创建Django项目:
django-admin startproject 项目名
-
启动Django项目:
python manage.py runserver
-
创建应用app:
python manage.py startapp 应用名
使用pycharm创建Django项目与使用命令行创建Django项目的区别
- 使用命令行创建Django项目不会帮你创建templates文件夹,不会替你配置templates文件夹的路径
- 使用命令行创建不会帮你注册app应用,虽然pycharm会帮你注册应用,但是只会在创建第一个应用时会帮你注册
Django的post请求问题
当我们通过post请求请求服务器资源时会被服务器拒绝报一个403的错误。
这是因为Django的默认开启防止csrf(跨站点请求伪造)攻击
解决办法:
-
将setting.py 文件中的MIDDLEWARE中的django.middleware.csrf.CsrfViewMiddleware语句注释掉
-
from django.views.decorators.csrf import csrf_exempt #在处理函数上加装饰器,使本次请求忽略csrf校验 @csrf_exempt def post(request): name=request.post['name'] return HttpResponse('welcome!{}'.format(name))
-
可以在form表单中添加{% csrf_token %}随着表单的提交而一起提交
通过request对象获取前端数据
-
请求方式:method
request.method # 这个会返回GET或POST
-
获取前端携带的数据
-
get请求
data = request.GET
-
post请求
data = request.POST
-
Django连接本地数据库
-
第一步:配置数据库
DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', # 指定数据库 'NAME': 'lx', # 使用的数据库 'USER':'root', # 用户名 'PASSWORD':'root', # 密码 'HOST':'127.0.0.1', # 地址 'PORT':3306, # 端口号 'CHARSET':'utf8' # 指定编码格式 } }
如果我们只是配置了下数据库的话那么我们的程序还是会报错-_-
-
第二步:配置连接时使用的模块
因为Django默认是使用MySQLdb来连接数据库,但是很不幸它不支持3.X的版本
这个时候我们就要告诉Django使用pymysql来连接数据库使用
这里有两种方法:
-
第一种是在与项目名同名的文件夹里的 __init__.py 文件中添加两行语句
import pymysql pymysql.install_as_MySQLdb()
-
第二种方法与第一种方法一样,只不过是在app应用里面的 __init__.py 文件夹中加入上面的两句话
-
其实还有第三种方法,你可以装一个mysqlclient模块来代替mysqldb
-
Django的ORM简介
orm对象关系映射
类 数据库的表
对象 表的记录
对象获取属性 记录的某个字段对应的值
优点与缺点
- 优点:能够让一个不会数据库操作的人,也能够简单快捷去使用数据库
- 缺点:由于封装程度太高,可能会导致程序的执行效率偏低,需要结合项目需求,手写sql语句
注意事项:
django的orm不会自动帮你创建库,库需要你自己手动创建表会自动帮你创建
你只需要书写符合django的orm语法的代码即可
通过orm创建
去应用下所在的models.py中书写类
from django.db import models
# Create your models here.
class Userinfo(models.Model):
# 设置id字段为userinfo表的主键,相当于SQL语句中的 id int primary key auto_increment
id = models.AutoField(primary_key=True) # 在django中你可以不指定主键字段django orm会自动给你当前表新建一个名为id的主键字段
# 设置username字段 username varchar(64) CharField必须要指定max_length参数
username = models.CharField(max_length=64) # 在django orm中没有char字段,但是django允许自定义char字段
# 设置password字段 password int
password = models.IntegerField()
- 不会创建表,而是生成一个记录 ,将你当前的操作记录下来(记录到migrations文件夹)
python manage.py makemigrations
-
将你的orm语句真正的迁移到(同步)到数据库中
python manage.py migrate
注:只要你在models.py中修改了跟数据库相关的代码 你就 必须 重新开始执行上面两条命令
数据库表字段的 增删改 都可以通过models中的类来修改数据表对应的字段
ORM的简单运用——增删改查
-
查
from 应用名 import models user_list = models.类.objects.get(id=1) # 但是这个方法如果没有查询到数据就会报错 user_list = models.类.objects.filter(id=1) # 这个方法不会报错,如果是两个条件及以上条件间是以and连接 user_list = models.类.objects.all() # 获取数据表的全部数据
-
增
from 应用名 import models user_obj = models.类(id=0, username='gredae', password=123) user_obj.save() # 保存到数据库中 user_obj = models.类.objects.create(id=0, username='gredae',password=123) # 也是创建一条记录 # 如果需要插入一堆数据可以使用批量插入:bulk_create user_ls = [] for i in range(1000): user_ls.append(models.User(name=i)) # 创建类对象,并添加到列表中 models.User.objects.bulk_create(user_ls) # 通过bulk_create批量插入数据
-
改
from 应用名 import models # 修改单条记录 user_obj = models.类.objects.filter(id=1) user_obj.username = '戈达尔' user_obj.save() # 修改多条记录 user_list = models.类.objects.filter(id__lt=5) row = user_obj.update(username='gredae')
-
删
from 应用名 import models # 删除单条语句 user_obj = models.类.objects.filter(id=1) user_obj.delete() # 会立即删除并且没有返回值 # 删除多条语句 user_list = models.类.objects.filter(id__lt=5) row = user_obj.delete() # 程序员必备技能 models.objects.all().delete()