Django框架的学习,主要文件介绍,应用,小白必会三板斧
1.Django框架的学习,主要文件介绍,应用,小白必会三板斧
2.配置文件的介绍,静态文件的配置,request对象请求方法,pycharm连接数据库,Django连接MySQL,Django中的ORM,ORM增删改查3.url函数的使用,无名分组和有名分组,反向解析,django2中5种转换器,路由分发,伪静态的概念,虚拟环境4.视图层:三板斧问题,JsonResponse序列化,form表单上传文件,request对象的其他几个方法,CBV的书写和FBV的写法,CBV的源码分析.模板层:变量之分配,过滤器5.模板之标签,if 标签,模板的继承.模型层:常见的十几种查询方法.测试环境的搭建,查看原生sql语句,基于双下滑线的查询,外键字段的查询6.外键字段的增删改查,多表查询,正反向的概念,子查询,多表查询之连表查询(基于双下划线的查询),聚合查询(aggregate),分组查询annotate,F与Q查询,django中如何开启事务7.choices参数的使用,MTV和MVC的概念,多对多的三种创建方式,Ajax技术简介,小案例8.前后端数据传输的编码格式,Ajax提交json格式的数据,Ajax提交文件数据,AJax结合layer弹窗实现删除的二次确认,批量插入数据9.推导分页的原理,分页类的使用,cookie和session的介绍(重要),Django操作cookie10.Django操作cookie,Django操作session,Django中的Session配置,CBV添加装饰器,中间件,csrf跨站请求11.csrf跨站请求的相关装饰器,Auth模块的使用,相关方法12.ORM对数据的增删改查,动静态网页,Django创建表关系,Django框架的请求生命周期流程图Django学习前夕
我们之前学习了数据库、前端、Python基础等三大部分,但是,他们三块的内容没有串在一起,
也就没办法开发出一个完成的web项目出来,因此,我们通过Django框架把这三者融合在一起,
以后我们就可以很方便的开发出各种各样的项目.
web应用的简介
"""是因为Django框架是一个专门用来开发web项目的框架"""
1. Web应用程序是什么
# Web应用程序是一种可以通过Web访问的应用程序,也就是说只需要一个浏览器即可,
不需要其他软件了
2. 应用程序有两种模式C/S、B/S。
# Django就是开发的B/S应用程序,所以,我们就认为浏览器就是我们的客户端、
Django框架就是服务端
3. Web应用程序的优点
1. 只需要一个浏览器即可,不在需要安装其他应用软件
2. 节省用户的空间资源
3. 它们不需要更新,是因为服务端只要一更新版本,会直接影响客户端的更新
4. 跨平台使用
4. Web应用程序的缺点
"""一旦web应用的服务端宕机,直接影响客户端的正常访问!!!"""
# 什么是web框架:框架的意思就是别人提前写好的,我们只需要按照人家的要求在固定的位置写固定的代码
简单Web框架实现
随着业务逻辑复杂度的增加,处理业务逻辑的函数以及url_patterns中的映射关系都会不断地增多,此时仍然把所有代码都放到一个文件中,程序的可读性和可扩展性都会变得非常差,所以我们应该将现有的代码拆分到不同文件中:
mysite # 文件夹
├── app01 # 文件夹
│ └── views.py
├── mysite # 文件夹
│ └── urls.py
└── templates # 文件夹
│ ├── index.html
│ └── timer.html
├── main.py
views.py 内容如下:
# 处理业务逻辑的函数
from jinja2 import Template
def index(environ):
with open('index.html', 'r', encoding='utf-8') as f:
data = f.read()
return data.encode('utf-8')
def timer(environ):
import time
now = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())
with open('timer.html', 'r', encoding='utf-8') as f:
data = f.read()
template=Template(data)
data=template.render({'xxx':now,'user':'ly','role':'大总管'})
return data.encode('utf-8')
urls.py内容如下:
# 路径跟函数的映射关系
from app01.views import * # 需要导入views中的函数
url_patterns = [
('/index', index),
('/timer', timer),
]
main.py 内容如下:
from wsgiref.simple_server import make_server
from mysite.urls import url_patterns # 需要导入urls中的url_patterns
def app(environ, start_response):
start_response('200 OK', [('Content-Type', 'text/html')])
# 拿到请求的url并根据映射关系url_patters执行相应的函数
reuqest_url = environ.get('PATH_INFO')
for url in url_patterns:
if url[0] == reuqest_url:
data = url[1](environ)
break
else:
data = b'404'
return [data]
if __name__ == '__main__':
s = make_server('', 8011, app)
print('监听8011')
s.serve_forever()
''''
至此,我们就针对application的开发自定义了一个框架,所以说框架的本质就是一系列功能的集合体、
不同的功能放到不同的文件中。有了该框架,可以让我们专注于业务逻辑的编写,
极大的提高了开发web应用的效率(开发web应用的框架可以简称为web框架),比如我们新增一个业务逻辑,
要求为:浏览器输入http://127.0.0.1:8011/home 就能访问到home.html页面
'''
简单web框架的使用
在框架的基础上具体开发步骤如下:
步骤一:在templates文件夹下新增home.html
步骤二:在urls.py的url_patterns中新增一条映射关系
url_patterns = [
('/index', index),
('/timer', timer),
('/home', home), # 新增的映射关系
]
步骤三:在views.py中新增一个名为home的函数
def home(environ):
with open('templates/home.html', 'r',encoding='utf-8') as f:
data = f.read()
return data.encode('utf-8')
我们自定义的框架功能有限,总结下来大致有这么几个功能
功能1、socket收发消息,指的是server
功能2、根据不同的路径执行不同的处理逻辑/功能
功能3、返回动态页面(字符串的替换),如jinja2
手撸web框架(推导框架的演变、代码无需掌握、重点看思路)
# web应用程序主要就是B/S架构的,浏览器就是客户端、我们现在开发出一个服务端出来即可
# 你们就可以认为框架就是客户端的服务端
"""通过socket写出一个服务端出来"""
# HTTP协议的相关知识
1. 四大特性
# 基于请求和响应
# 基于TCP协议之上的应用层协议
# 无状态
# 短连接
2. 请求数据格式
# 请求首行(请求方式、协议版本号)
# 请求头
# \r\n
# 请求体
3. 响应数据格式
# 响应首行(响应状态码)
# 响应头
# \r\n
# 响应体
4. 响应状态码
1xx
2xx
3xx
4xx
5xx
# 如何做到在浏览器地址栏中写什么后缀就返回什么内容?
思路:
1. 在后端肯定是要知道你在浏览器输入了什么后缀
2. 判断是什么后缀就返回什么内容
conn.send(b'')
# 浏览器每次朝后端发起请求的时候,都会多一次:/favicon.ico,你可以先忽略
<link rel="shortcut icon" href="https://csdnimg.cn/public/favicon.ico" >
# 存在的问题:
1. socket部分我们每次都要书写(要写重复代码)
2. 我们需要自己来处理HTTP格式的数据,自己做切分,自己来取值等比较麻烦
3. 并发问题没有解决
# 如何去优化以上问题
借助于wsgiref模块(内置模块,直接使用)
from wsgiref.simple_server import make_server
# 解决了socket部分不用我们写了,在wsgiref模块里人家帮我们写了
# 它解决了并发问题 WSGIServer类------>wsgiref------>它能够解决的并发量不高----->本地使用wsgiref服务器--------------->代码上线之后,就不是有它----------->uwsgi服务器(它支持的并发量更高)
# 代码上线之后会使用 Nginx + uwsgi------------------>后续再将.
def run(env, response):
"""
:param env: 客户端每次发起请求的时候,所携带的数据都在这个里面,就类似属于是request
:param response: 是后端给浏览器返回的数据
:return: 返回给浏览器查看的
"""
print(env) # 把HTTP格式的数据都封装到了大字典里去了
response("200 OK", [])
# 我们取到当前的后缀内容
current_path = env.get('PATH_INFO')
# 做判断
if current_path == '/index':
return [b'index']
elif current_path == '/login':
return [b'login']
else:
return [b'404 error']
if __name__ == '__main__':
server = make_server(host='127.0.0.1', port=8000, app=run)
"""
这句话写完就会实时监听127.0.0.1:8000这个地址
只要有客户端来访问这个地址,那么,我服务端就能够接收到客户端的请求,
就类似于是我们的socket端
app=run:只要有客户度发过去请求,那么就会把处理的请求交给run这个函数来处理,
run是个函数名(在django中用的就是函数名)
后面你要学的flask框架这个地方写的是对象,而不是函数名
obj()-------------->会触发类的__call__方法--------->flask框架的启动代码就
在__call__里面写着的,是入口
"""
# 启动服务端
server.serve_forever()
"""
views.py----------------->视图文件--------->主要就是写后端的逻辑的
urls.py------------------>路由文件(后缀)---------->路由与视图函数的对应关系
templates---------------->专门用来存储html文件的
"""
# 以后我们要想增加一个后缀,只需要在urls.py中写一个路由和在views.py中写一个视图函数即可.
Django框架的学习
Django是Python中使用最多的一个主流框架!
python中的主流框架:
Django:
# 主要用来开发web项目的,它比较笨重,一般小型项目不怎么使用它,大而全
flask:
# 它是一个比较轻量级的框架,它主要依赖于第三方的模块,不断的安装第三方模块,小而精
tornado:
# 异步非阻塞,解决高并发比较擅长
# 这个框架学起来有点难度.
...
# 版本问题:
1.X(老项目) 2.X(新项目) 3.X(新版本)
1.x和2.x本质上差别不是很大,但是也有区别,我们讲1.x,附带讲2.x的区别
# 在drf中,都要使用2.x以上版本,drf这个框架要求django的版本必须是2.x以上
# 注意事项:
1. 你的项目名称和应用名称以及其他文件的名称都要使用英文的,坚决不能够使用中文的
2. 你的计算机名称最后都使用英文的
3. 一个pycharm窗口只打开一个django项目,不能够一个窗口打开很多个django项目
如何使用Django
1. 安装django
pip install django==1.11
Django是python的Web框架,应该为其选择哪个版本的python解释器呢?
如何验证django是否安装成功
在cmd中输入:django-admin------>如果有输出内容就说明安装成功
2. 创建项目
# 1 命令行创建
"""你可以先切换路径,切换到你想把django项目放到的路径里"""
django-admin startpeoject 项目名
django-admin startproject myfirst_dj
# 2 pycharm创建
File
New Project
django
...
3. 如何启动项目
# 1. 命令行启动
先把路径切到manage.py所在的路径
python3 manage.py runserver
"""项目启动起来之后,会监听:http://127.0.0.1:8000/"""
默认端口号是:8000
如何修改端口号:
python3 manage.py runserver 127.0.0.1 8001
# 2. pycharm启动
点击绿色按钮
# 访问项目: http://127.0.0.1:8000/
4. Next, start your first app by running python manage.py startapp [app_label].
"""创建应用"""
# 如何创建应用
1. 命令行创建
python manage.py startapp [app_label].
python manage.py startapp app01.
2. pycharm创建
# 当你把应用创建出来之后,紧接着要做的一件事情就是:注册应用
# 在配置文件中注册应用,这个应用才生效
****************************************************************************************
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'app01.apps.App01Config', # 全称
'app01', # 简称
]
****************************************************************************************
# 以后我们在哪里写代码呢?
主要文件介绍
myfirst_dj # 项目名称
app01 # 应用名称
migrations # 这个是用来存储数据库迁移记录
__init__.py
admin.py # 跟后台项目注册等相关的
apps.py # 跟一些注册相关
models.py # 跟数据库打交道的 模型层----->MTV模型
tests.py # 测试文件
views.py # 视图文件,写一些后端逻辑
myfirst_dj
__init__.py
settings.py # 配置文件相关的
urls.py # 路由相关的
wsgi.py # 内部封装的wsgiref服务器,uwsgi服务器之后,这个文件就没用了uwsgi.py
db.sqlite3 # Django自带的小型数据库
manage.py # Django框架的入口文件
应用
# django主要开发的就是一款web应用!
Django框架类似于是一所大学(空壳子)
应用就是大学里面的二级学院(具备独立的功能模块)
# 一个应用就是一个独立的功能模块
比如:
user
order
address
cart
...
# 应用名一定要见名知意,但是我们教学为了方便,我都使用app01、02、03...
小白必会三板斧
The view app01.views.index didn't return an HttpResponse object. It returned None instead.
return HttpResponse("OK") # 返回字符串的
return render(request, 'index.html') # 返回html文件的
return redirect('http://www.baidu.com') # 重定向
###############################自己创建的templates文件夹,要在配置文件注册################
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [os.path.join(BASE_DIR, 'templates')],
'DIRS': [os.path.join(BASE_DIR, 'templates')],
'APP_DIRS': True,
'OPTIONS': {
'context_processors': [
'django.template.context_processors.debug',
'django.template.context_processors.request',
'django.contrib.auth.context_processors.auth',
'django.contrib.messages.context_processors.messages',
],
},
},
]
###############################自己创建的templates文件夹,要在配置文件注册################
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY