Django知识整理一(Http协议,wsgire模块,动静态网页介绍,python三大主流框架,Django安装的注意事项,)
http协议
四大特性
- 基于tcp/ip协议之上作用于应用层
- 基于响应 请求
- 无状态
- 无连接
数据格式
请求方式
- get请求 :朝别人要数据
- post请求 : 朝别人提交数据
请求格式
- 请求首行(请求格式,协议版本)
- 请求头(一大推k:v键值对)
- \r\n(空格)
- 请求体(get请求没有请求体)
响应格式
(格式与请求格式相同)
响应状态码
1xx:服务器成功接收到你的数据,正在处理,你可以继续提交其他数据
2xx: 服务器响应成功 (200 ok)
3xx: 重定向
4xx: 请求错误(404 请求资源不存在. 403 拒绝访问)
5xx: 服务器内部错误
wsgiref模块
它是一个web服务网关接口,它主要做了下面几件事:
-
自动帮你封装好了socket代码
-
http数据自动帮你处理好了:
- 请求来的时候自动帮你处理http数据格式,返回一串字典格式的数据.
- 响应走的时候帮你把字典格式的数据封装成了符合http协议的数据格式
-
根据不同的功能拆分成不同的py文件
- urls.py 路由与视图函数对应关系
- views.py 处理后端业务逻辑的视图函数 (视图函数不单单只是函数,也可以是类)
- templates 专门存放html文件
规律: 只要你想添加功能 只需要在urls.py中添加一条对应关系再去views.py写一个视图函数
动静态网页
静态网页: 数据是写死的,万年不变
动态网页: 数据是实时获取的
- 如果将后端获取到的时间(字符串)传递给前端页面,可以利用字符串的替换 实现数据传递(replace方法)
from datetime import datetime
def get_time(env):
current_time = datetime.now().strftime('%Y-%m-%d %X')
with open(r'D:\上海Python11期视频\python11期视频\day56\templates\get_time.html','r',encoding='utf-8') as f:
data = f.read()
data = data.replace('$$time$$',current_time)
return data
前端
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<script src="https://cdn.bootcss.com/jquery/3.4.1/jquery.min.js"></script>
<link href="https://cdn.bootcss.com/twitter-bootstrap/3.3.1/css/bootstrap.min.css" rel="stylesheet">
<script src="https://cdn.bootcss.com/twitter-bootstrap/3.3.1/js/bootstrap.min.js"></script>
</head>
<body>
$$time$$
</body>
</html>
-
如果将字典传递给前端页面,并且可以在前端使用字典的方法,就需要借助于jinjia2模块,实现模块的渲染
jinja2 下载 pip3 install jinja2
from jinja2 import Template def get_user(env): d = {'name':'jason','pwd':'123','hobby': ['read','running','music']} with open(r'D:\上海Python11期视频\python11期视频\day56\templates\get_user.html','r',encoding='utf-8') as f: data = f.read() temp = Template(data) res = temp.render(user=d) # 将字典d传递给前端页面 页面上通过变量名user就能够获取到该字典 return res
前端
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> <script src="https://cdn.bootcss.com/jquery/3.4.1/jquery.min.js"></script> <link href="https://cdn.bootcss.com/twitter-bootstrap/3.3.1/css/bootstrap.min.css" rel="stylesheet"> <script src="https://cdn.bootcss.com/twitter-bootstrap/3.3.1/js/bootstrap.min.js"></script> </head> <body> <p>{{ user }}</p> <p>{{ user.name }}</p> <p>{{ user['pwd'] }}</p> <p>{{ user.get('hobby') }}</p> </body> </html>
模板的渲染 : 利用 模板语法,实现后端传递数据给前端html页面模板语法的书写格式;
-
模板语法(极其贴近python后端语法)
#变量名 <p>{{ user }}</p> <p>{{ user.name }}</p> <p>{{ user['pwd'] }}</p> <p>{{ user.get('hobby') }}</p> #语法 {% for user_dict in user_list %} <tr> <td>{{ user_dict.id }}</td> <td>{{ user_dict.name }}</td> <td>{{ user_dict.pwd }}</td> </tr> {% endfor %}
-
-
如果将数据库中的数据传给前端
import pymysql
def get_db(env):
conn = pymysql.connect(
host = '127.0.0.1',
port = 3306,
user = 'root',
password = 'root',
database = 'day56',
charset = 'utf8',
autocommit = True
)
cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)
sql = "select * from userinfo"
cursor.execute(sql)
res = cursor.fetchall()
print(res)
with open(r'D:\上海Python11期视频\python11期视频\day56\templates\get_db.html','r',encoding='utf-8') as f:
data = f.read()
temp = Template(data)
ret = temp.render(user_list = res) # 将字典d传递给前端页面 页面上通过变量名user就能够获取到该字典
前端
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<script src="https://cdn.bootcss.com/jquery/3.4.1/jquery.min.js"></script>
<link href="https://cdn.bootcss.com/twitter-bootstrap/3.3.1/css/bootstrap.min.css" rel="stylesheet">
<script src="https://cdn.bootcss.com/twitter-bootstrap/3.3.1/js/bootstrap.min.js"></script>
</head>
<body>
<div class="container">
<div class="row">
<div class="col-md-8 col-md-offset-2">
<h1 class="text-center">用户列表</h1>
<table class="table table-bordered table-striped table-hover">
<thead>
<tr>
<th>id</th>
<th>name</th>
<th>pwd</th>
</tr>
</thead>
<tbody>
{% for user_dict in user_list %}
<tr>
<td>{{ user_dict.id }}</td>
<td>{{ user_dict.name }}</td>
<td>{{ user_dict.pwd }}</td>
</tr>
{% endfor %}
</tbody>
</table>
</div>
</div>
</div>
</body>
</html>
以上是为了加深理解动态网页而举的三个例子
python三大主流框架
Django
- 特点 :大而全,自带的功能特别多,类似于航空母舰
- 缺点: 有时候过于笨重
Flask:
- 特点: 小而精, 第三方的模块特别多, 类似游骑兵(如果将flask第三方模块全部加起来,完全可以超过Django)
- 缺点 : 自带功能特别少 , 比较依赖于第三方模块
Tornado
- 异步非阻塞
- 速度快,牛逼到可以开发游戏服务器
A:socket部分
B:路由与视图函数对应关系
C:模板语法
Django:
A用的别人的 wsgiref
B自己写的
C自己写的
Flask
A用的别人的 werkzeug(基于wsgiref)
B自己写的
C用的别人的 jinja2
Tornado
三者全是自己写的
安装Django前注意事项
- 计算机不能为中文
- 一个pycharm窗口代表一个项目
- 项目名或者路径里不要有中文
下载安装Django
pip3 install django==1.11.11(命令行)
验证Django是否安装成功
django-admin
一个django项目就类似于是一所大学,而app就类似于大学里面的学院
django其实就是用来存放一个个应用的,django支持任意多个app(应用)
一个app就相当于一块独立的功能
用户功能
管理功能
命令行使用
创建django项目
django-admin startproject mysite(项目名)
启动django项目
python manage.py runserver
创建应用app
python manage.py startapp app01(应用名)
注意:
1.使用命令行创建django项目 不会自动帮你创建templates文件夹只能自己创建
2.templates文件夹创建完成后还需要到settings文件中手动在TEMPLATES项里写配置
[os.path.join(BASE_DIR, 'templates')]
3. 新创建的app文件夹需要你去settings配置文件中注册(INSTALLED_APPS项包含所有注册应用),有两种书写方式:
完整语法:'app01.apps.App01config'
简写:'app01'
pycharm使用
直接在pycharm中新建一个django项目
注意:
pycharm只会帮你自动注册第一个你在创建项目的时候写的应用,之后的应用需要自己手动在settings中注册(INSTALLED_APPS项包含所有注册应用),有两种书写方式:
完整语法:'app01.apps.App01config'
简写:'app01'
'''
项目名
跟项目名同名的文件夹
settings.py 暴露给用户的配置文件
urls.py 路由与视图函数对应关系
应用名
migrations文件夹 存放数据库迁移记录的
admin.py django后台管理
apps.py 注册相关
models.py 模型类
tests.py 测试文件
views.py 存放视图函数
templates文件夹 存放html文件
manage.py django入口文件
'''