Django 框架
1.纯手撸web框架
Web 框架的本质
1.手动书写socket代码
import socket sk = socket.socket() sk.bind(("127.0.0.1", 80)) sk.listen() while True: conn, addr = sk.accept() data = conn.recv(8096) conn.send(b"OK") conn.close()
2.手动处理http数据
HTTP协议对收发消息的格式要求
每个HTTP请求和响应都遵循相同的格式,一个HTTP包含Header和Body两部分,其中Body是可选的。 HTTP响应的Header中有一个 Content-Type
表明响应的内容格式。如 text/html
表示HTML网页。
HTTP get 请求的格式:
HTTP POST 请求的格式:
服务器程序和应用程序
对于真实开发中的python web程序来说,一般会分为两部分:服务器程序和应用程序。
服务器程序负责对socket服务器进行封装,并在请求到来时,对请求的各种数据进行整理。
应用程序则负责具体的逻辑处理。为了方便应用程序的开发,就出现了众多的Web框架,例如:Django、Flask、web.py 等。不同的框架有不同的开发方式,但是无论如何,开发出的应用程序都要和服务器程序配合,才能为用户提供服务。
这样,服务器程序就需要为不同的框架提供不同的支持。这样混乱的局面无论对于服务器还是框架,都是不好的。对服务器来说,需要支持各种不同框架,对框架来说,只有支持它的服务器才能被开发出的应用使用。
这时候,标准化就变得尤为重要。我们可以设立一个标准,只要服务器程序支持这个标准,框架也支持这个标准,那么他们就可以配合使用。一旦标准确定,双方各自实现。这样,服务器可以支持更多支持标准的框架,框架也可以使用更多支持标准的服务器。
WSGI(Web Server Gateway Interface)就是一种规范,它定义了使用Python编写的web应用程序与web服务器程序之间的接口格式,实现web应用程序与web服务器程序间的解耦。
常用的WSGI服务器有uwsgi、Gunicorn。而Python标准库提供的独立WSGI服务器叫wsgiref,Django开发环境用的就是这个模块来做服务器。
# 2.基于wsgiref模块帮助我们处理scoket以及http数据
wsgiref模块
(web服务端网关接口)
我们利用wsgiref模块来替换我们自己写的web框架的socket server部分:
from wsgiref.simple_server import make_server from jinja2 import Template def index(): with open("index2.html", "r") as f: data = f.read() template = Template(data) # 生成模板文件 ret = template.render({"name": "Alex", "hobby_list": ["烫头", "泡吧"]}) # 把数据填充到模板里面 return [bytes(ret, encoding="utf8"), ] def home(): with open("home.html", "rb") as f: data = f.read() return [data, ] # 定义一个url和函数的对应关系 URL_LIST = [ ("/index/", index), ("/home/", home), ] def run_server(environ, start_response): start_response('200 OK', [('Content-Type', 'text/html;charset=utf8'), ]) # 设置HTTP响应的状态码和头信息 url = environ['PATH_INFO'] # 取到用户输入的url func = None # 将要执行的函数 for i in URL_LIST: if i[0] == url: func = i[1] # 去之前定义好的url列表里找url应该执行的函数 break if func: # 如果能找到要执行的函数 return func() # 返回函数的执行结果 else: return [bytes("404没有该页面", encoding="utf8"), ] if __name__ == '__main__': httpd = make_server('', 8000, run_server) print("Serving HTTP on port 8000...") httpd.serve_forever()
1.请求来的时候 解析http数据 帮你打包成一个字典传输给你 便于你操作各项数据
2.响应走的时候 自动帮你把数据再打包成符合http协议格式的样子 再返回给前端
启动
server = make_server('127.0.0.1',8080,run)
# 实时监测127.0.0.1:8080地址 一旦有客户端来连接 会自动加括号调用run方法
server.serve_forever() # 启动服务端
3.封装路由与视图函数对应关系 以及视图函数文件 网站用到的所有的html文件全部放在了templates文件夹下
1.urls.py 路由与视图函数对应关系
2.views.py 视图函数(视图函数不单单指函数 也可以是类)
3.templates 模板文件夹
## 给 html 页面传递数据
1.如何将当前日期渲染到html页面 >>> 用r模式读取html文件成字符串 利用字符串的替换
2.如何将一个字典渲染到html页面上并且还能够简单快捷取值操作
## 4.基于jinja2实现模板的渲染
模板的渲染
jinja2模块
1.模板的渲染(传数据)
2.模板语法(极其贴近python语法)
from jinja2 import Template
将文本格式的html数据传入Template
render()
模板语法
{{ data }}
{% for user in user_list %}
{% endfor %}
模板语法 只有两种情况
{{}}:变量相关
{%%}:逻辑相关
4.对不同的功能拆封成不同的文件
templates文件夹(专门放html文件)
urls.py
views.py
对于我们这个建议版本的web框架 如果想要新增一个功能只需要在
上面两个文件中各写一点代码即可
后端生成好数据 通过某种方式传递给前端页面使用(前端页面可以基于模板语法更加快捷简便使用后端传过来的数据)
### Web框架
python三大主流web框架
1.Django:大而全 自带的功能特别特别多 就类似于航空母舰 有时候过于笨重
2.Flask:短小精悍 自带的功能特别特别少 全都是依赖于第三方组件
flask框架第三方的组件特别多 如果把flask第三方全部加起来 完全可以盖过Django
比较受限于第三方的开发者
3.Tornado:天生的异步非阻塞框架 速度特别快 能够抗住高并发
可以开发游戏服务器
A:socket
B:路由与视图函数匹配
C:模板语法
Django
A:用的别人的 wsgiref
B:自己写的
C:自己写的
Flask
A:用的别人的 wsgiref>>> werkzeug
B:自己写的
C:用的别人的 jinja2
Tornado
A,B,C全都是自己写的
Django
注意事项
1.你的计算机的名称不能有中文
2.文件的命名尽量也不要用中文
3.一个pycharm窗口只能有一个项目 不要把多个项目放在一个窗口下
django版本问题
1.x 2.x
以django1.11版本为主
django下载
pip3 install django==1.11.11
如何确认是否下载成功
命令行敲 django-admin
如何创建django项目
命令行式
1.命令行创建django项目
django-admin startproject mysite
django-admin startproject 项目名
2.命令行创建django应用(一个应用对应一块儿独立的功能)
django-admin startapp 应用名
3.命令行启动django项目
python manage.py runserver
注意 用命令行创建django项目 不会自动新建templates模板文件夹
需要你自己手动创建 并且需要你自己去settings.py文件中注册该文件路径
pycharm快捷方式
(******)
创建的应用一定要在settings中注册 才能生效 否则无法识别
django主要文件介绍
项目名文件
同名的项目文件夹
settings.py django暴露给用户可配置的文件
urls.py 路由与视图函数对应关系
manage.py django入口文件
应用文件夹
migrations文件夹 数据库迁移记录
admin.py django后台管理
apps.py 应用注册相关
models.py orm模型类
tests.py 测试文件
views.py 视图函数
django小白必会三板斧:
from django.shortcuts import HttpResponse, render, redirect
HttpResponse:返回字符串
def index(request): # 业务逻辑代码 return HttpResponse("heelo")
render:返回html页面 并且能够给该页面传值
除request参数外还接受一个待渲染的模板文件和一个保存具体数据的字典参数。
将数据填充进模板文件,最后把结果返回给浏览器。(类似于我们上面用到的jinja2)
def index(request): # 业务逻辑代码 return render(request, "index.html", {"name": "alex", "hobby": ["大大大", "丹丹"]、、、
redirect:重定向
接受一个URL参数,表示跳转到指定的URL。
def index(request): # 业务逻辑 return redirect("/home/")