Django学习——软件开发架构、HTTP协议、WEB框架、动静态网页、主流web框架、django框架、命令行模式、pycharm快捷方式、django目录结构
Django
软件开发架构
1.C/S
2.B/S
- B/S本质也是一种C/S架构
HTTP协议
"""规定了浏览器与服务器之间数据交互的格式"""
一.四大特性
1.基于TCP、IP作用于应用层之上的协议
2.基于请求响应
3.无状态
- 见你千百遍我都当你如初见
- cookie、session、token...
4.无(短)连接
- 长连接: websocket
二、数据格式
- 请求数据格式
- 请求首行(请求方法...)
- 请求头(一大堆K:V键值对)
- 换行 换行符 不能省略
- 请求体(并不是所有的请求方法都有请求体 主要用来携带敏感性数据)
- 响应数据格式
- 响应首行(响应状态码...)
- 响应头(一大堆K:V键值对)
- 换行
- 响应体(展示给用户的数据)
三、响应状态码
用简单的数字来表示一串中文意思
- 1xx: 服务端已经接受到你的数据正在处理,你可以继续提交
- 2xx:200 OK 请求成功
- 3xx: 重定向 (原本想访问A 但是内部跳到B)
- 4xx: 403 当前请求不符合条件 404 请求资源不存在
- 5xx:服务器内部错误
注意:除了上述统一的响应状态码之外,公司还可以自定义自己的状态码
四、请求方法
1.get请求
- 朝别人索要数据
2.post请求
- 朝别人提交数据
WEB框架
问题一
- 服务端代码重复
- 手动处理http数据格式过于繁琐
基于wsgiref模块解决了上述两个问题
问题二
- 网址很多的情况下如何匹配
- 当功能比较复杂的时候如何处理
封装处理
1.定义一个网址与功能函数的对应关系
# 地址与功能对应关系
urls = [
('/index',index_func),
('/login',login_func),
('/reg',reg_func),
]
2.按照功能的不同划分成不同的py文件
urls.py views.py mainrun.py
3.书写服务端代码
func = None
# for 循环判断
for url_tuple in urls: # (),()
if current_path == url_tuple[0]:
# 将匹配到的函数名赋值给func变量
func = url_tuple[1]
break
# 判断func是否有值
if func:
# 执行对应的函数
res = func(request)
else:
res = errors(request)
return [bytes(res,encoding='utf-8')]
动静态网页
静态网页
数据全部都是写死的,万年不变
动态网页
数据来源于后端(代码、数据库)
1.访问网址展示当前时间(由后端模块生成并展示到HTML页面)
def get_time_func(request):
from datetime import datetime
current_time = datetime.now().strftime('%Y-%m-%d %X')
with open(r'get_time.html','r',encoding='utf-8') as f:
data = f.read() # 字符串
data = data.replace('abdc',current_time)
return data
2.后端有一个字典,将该字典传递给HTML页面,并且在该页面上还可以使用字典取值的各种操作
jinja2模块
pip3 install jinja2
ps:该模块是flask框架必备的模块,所以下载flask也会自动下载该模块
模板语法(用近似于python的语法在HTML文件上操作)
{{user_data}}
{{user_data['username']}}
{{user_data.get('password')}}
{{user_data.hobby}}
{%for user_dict in data_list%}
<tr>
<td>{{user_dict.id}}</td>
<td>{{user_dict.name}}</td>
<td>{{user_dict.age}}</td>
</tr>
{%endfor%}
3.获取MySQL数据库数据展示到页面上
def get_db_func(request):
import pymysql
conn = pymysql.connect(
host='127.0.0.1',
port=3306,
user='root',
password='root',
database='db666',
charset='utf8',
autocommit=True
)
cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)
sql = 'select * from userinfo' # 分号可写可不写
affect_rows = cursor.execute(sql)
res1 = cursor.fetchall() # [{},{},{}]
# print(res)
with open(r'templates/get_db.html', 'r', encoding='utf-8') as f:
data = f.read()
temp = Template(data)
res = temp.render(data_list=res1)
return res
mysql> create database db666;
Query OK, 1 row affected (0.36 sec)
mysql> use db666
Database changed
mysql> create table userinfo(
-> id int primary key auto_increment,
-> name char(32),
-> age int
-> );
Query OK, 0 rows affected (0.36 sec)
mysql> insert into userinfo(name,age) values('jason',18),('egon',84),('tony',77),('jack',66);
Query OK, 4 rows affected (0.12 sec)
Records: 4 Duplicates: 0 Warnings: 0
mysql> select name,age from userinfo;
+-------+------+
| name | age |
+-------+------+
| jason | 18 |
| egon | 84 |
| tony | 77 |
| jack | 66 |
+-------+------+
4 rows in set (0.03 sec)
总结
1.纯手工写WEB框架
2.wsgire模块
1.封装了socket代码
2.处理了http数据格式
3.根据功能的不同拆分成不同的文件夹
urls.py 路由与视图函数对应关系
views.py 视图函数
templates 模板文件夹
# 1. 第一步 添加路由与视图函数的对应关系
# 2. 去views中书写功能代码
# 3. 如果需要使用到HTML则去模板文件夹中操作
4.jinja2模板语法
{{}}
{%%}
5.简易版本web框架流程图
主流web框架
1.django框架
大而全,自带的功能组件非常非常多!类似于航空母舰
2.flask框架
小而精,自身的功能组件非常非常少!类似于游骑兵
但是第三方模块非常之多,如果把第三方模块全部叠加起来完全可以盖过Django
有时候也会受限于第三方模块
ps:三行代码就可以启动一个flask后端服务
3.tornado框架
异步非阻塞 速度非常的快 快到可以开发游戏服务器
ps:Sanic、FastAPI...
"""注意:小白不要同时学习两个及以上"""
A: socket部分
B:路由与视图匹配
C:模板语法
Django
A:用的是wsgiref模块
B:自己写的
C:自己写的
flask
A:用的是wsgiref模块封装之后werkzeug
B:自己写的
C:jinja2模块
tornado
A:自己写的
B:自己写的
C:自己写的
django框架
# 注意事项
1.计算机名称不能有中文
2.项目名和py文件名最好也不要使用中文
3.Django版本问题
1.X:
2.X:1和2几乎一样
3.X:异步
ps:版本选择1.11.11版本
# 命令行下载
pip3 install django==1.11.11
# 测试是否安装完成
Django-admin
# 查看Django版本
1. python -m django --version
2. import django
django.get_version()
命令行模式
C:\Users\Thinkpad>d:
D:\>django-admin startproject mysite
1.创建Django项目
django-admin startproject 项目名
2.启动Django项目
cd 项目名
python3 manage.py runserver ip:port
ps:如果报错需要修改py文件源码
D:\python\lib\site-packages\django\contrib\admin\widgets.py
line 152行后面的逗号去掉即可!!!
'%s=%s' % (k, v) for k, v in params.items()
D:\>cd mysite
D:\mysite>python manage.py runserver
# 错误
SyntaxError: Generator expression must be parenthesized (widgets.py, line 152)
# 成功提示
Django version 1.11.11, using settings 'mysite.settings'
Starting development server at http://127.0.0.1:8000/
Quit the server with CTRL-BREAK.
# 浏览器输入网址http://127.0.0.1:8000/
Next, start your first app by running python manage.py startapp [app_label].
接下来,通过运行 python manage.py startapp [app_label] 来启动你的第一个应用程序。
You're seeing this message because you have DEBUG = True in your Django settings file and you haven't configured any URLs. Get to work!
您看到此消息是因为您的 Django 设置文件中有 DEBUG = True 并且您尚未配置任何 URL。 开始工作!
3.创建app
python manage.py startapp app名字
D:\mysite>python manage.py startapp app01
app
django是一款专门开发app(应用)的软件
我们创建一个Django项目之后类似于创建了一所大学
而app就类似于大学里面的各个学院,每个学院都可以有自己独立的各项功能职责
Django相当于是一个空壳子用来给各个学院提供资源!!!
"""我们创建的app一定要去setting文件中注册才能生效"""
pycharm快捷方式
1.new project
django
项目名
解释器
应用名
# pycharm会自动帮你创建一个app
总结
命令行与pycharm创建不同点
1.命令行不会自动创建templates模板文件
2.命令行也不会自动配置模板文件夹路径
命令行: 'DIRS': [],
pycharm: 'DIRS': [os.path.join(BASE_DIR, 'templates')]
django目录结构
mysite
mysite文件夹 # 项目同名文件夹
__pycache__ # 缓存
__init__.py
settings.py # Django暴露给用户可以配置的配置文件
urls.py* # 路由与视图函数(可以是函数也可以是类)对应关系(路由层)
wsgi.py # 忽略
app01文件夹 # 应用(可以有多个)
migrations文件夹 # 存储数据库记录相关(类似于操作日志)
_init_.py
admin.py # django后台管理
apps.py # 注册app
models.py # 数据库相关(模型层)
tests.py # 测试文件
views.py* # 视图函数(视图层)
db.sqlite3 # Django自带的小型数据库
manage.py # django入口文件
templates* # 模板文件(存储html文件)(模板层)
python没有常量默认全部大写的变量看作常量
Tools Run manage.py Task... (Ctrl+Alt+R)
小白必会三板斧
1.HttpResponse
返回字符串
2.render
返回HTML页面,还可以使用模板语法
3.redirect 重定向
重定向
作业
1.理解上午框架推导思路(代码无需掌握)
2.独立完成Django安装及启动
3.使用Django展示数据库数据
urls.py views.py templstes
本文来自博客园,作者:寻月隐君,转载请注明原文链接:https://www.cnblogs.com/QiaoPengjun/p/16197238.html