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')}}

{%for user_dict in data_list%}

{{user_dict.id}}
{{user_dict.name}}
{{user_dict.age}}

{%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

posted @ 2022-04-26 23:45  寻月隐君  阅读(89)  评论(0)    收藏  举报