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
posted @ 2022-04-26 23:45  寻月隐君  阅读(58)  评论(0编辑  收藏  举报