Python进阶25-Django Web框架
-曾老湿, 江湖人称曾老大。
-多年互联网运维工作经验,曾负责过大规模集群架构自动化运维管理工作。 -擅长Web集群架构与自动化运维,曾负责国内某大型金融公司运维工作。 -devops项目经理兼DBA。 -开发过一套自动化运维平台(功能如下): 1)整合了各个公有云API,自主创建云主机。 2)ELK自动化收集日志功能。 3)Saltstack自动化运维统一配置管理工具。 4)Git、Jenkins自动化代码上线及自动化测试平台。 5)堡垒机,连接Linux、Windows平台及日志审计。 6)SQL执行及审批流程。 7)慢查询日志分析web界面。
基于socket手撸web框架
服务端 |
---|
import socket
sc = socket.socket()
sc.bind(('127.0.0.1', 8001))
sc.listen(5)
while True:
so, addr = sc.accept()
data = so.recv(1024)
print(data)
so.send(b'hello zls web')
so.close()


显示不了,为啥呢?因为服务端给浏览器返回的内容,浏览器不认识。我们要给浏览器返回http协议的内容
返回HTTP协议 |
---|
import socket
sc = socket.socket()
sc.bind(('127.0.0.1', 8001))
sc.listen(5)
while True:
so, addr = sc.accept()
data = so.recv(1024)
print(data)
so.send(b'HTTP/1.1 200 OK\r\n\r\nhello zls web')
so.close()


添加响应体 |
---|
import socket
sc = socket.socket()
sc.bind(('127.0.0.1', 8002))
sc.listen(5)
while True:
so, addr = sc.accept()
data = so.recv(1024)
print(data)
so.send(b'HTTP/1.1 200 OK\r\nContent-Type:text/html\r\n\r\nhello zls web')
so.close()

取出uri |
---|
import socket
sc = socket.socket()
sc.bind(('127.0.0.1', 8001))
sc.listen(5)
while True:
so, addr = sc.accept()
data = so.recv(1024)
print(data)
data=str(data,encoding='utf-8')
uri=data.split('\r\n')[0].split(' ')[1]
print(uri)
so.send(b'HTTP/1.1 200 OK\r\nContent-Type:text/html\r\n\r\nhello zls web')
so.close()

获取用户访问路径 |
---|
import socket
sc = socket.socket()
sc.bind(('127.0.0.1', 8001))
sc.listen(5)
while True:
so, addr = sc.accept()
data = so.recv(1024)
so.send(b'HTTP/1.1 200 OK\r\nContent-Type:text/html\r\n\r\n')
data=str(data,encoding='utf-8')
uri=data.split('\r\n')[0].split(' ')[1]
if uri == '/':
so.send(b'index.html')
else:
so.send(b'404')
so.close()


返回HTML |
---|
我们来返回一个html代码
import socket
sc = socket.socket()
sc.bind(('127.0.0.1', 8002))
sc.listen(5)
while True:
so, addr = sc.accept()
data = so.recv(1024)
so.send(b'HTTP/1.1 200 OK\r\nContent-Type:text/html\r\n\r\n')
data=str(data,encoding='utf-8')
uri=data.split('\r\n')[0].split(' ')[1]
if uri == '/':
so.send(b'<h1>zls_web</h1><img src="https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1591892187097&di=acd00d338f39e4d31aae486db1b53ec7&imgtype=0&src=http%3A%2F%2Fb.hiphotos.baidu.com%2Fzhidao%2Fpic%2Fitem%2F279759ee3d6d55fb0b6e354e6b224f4a20a4dd2a.jpg">')
else:
so.send(b'404')
so.close()

竟然这样可以返回一个html,那么我们是不是可以写到一个html文件中?
HTML写入文件 |
---|
import socket
sc = socket.socket()
sc.bind(('127.0.0.1', 8002))
sc.listen(5)
while True:
so, addr = sc.accept()
data = so.recv(1024)
so.send(b'HTTP/1.1 200 OK\r\nContent-Type:text/html\r\n\r\n')
data=str(data,encoding='utf-8')
uri=data.split('\r\n')[0].split(' ')[1]
if uri == '/':
with open('index.html','rb') as f:
page=f.read()
so.send(page)
else:
so.send(b'404')
so.close()
<!DOCTYPE html>
<html lang="zh-Hans">
<head>
<meta charset="UTF-8">
<title>曾老湿web</title>
</head>
<body>
<h1>zls_web</h1>
<img src="https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1591892187097&di=acd00d338f39e4d31aae486db1b53ec7&imgtype=0&src=http%3A%2F%2Fb.hiphotos.baidu.com%2Fzhidao%2Fpic%2Fitem%2F279759ee3d6d55fb0b6e354e6b224f4a20a4dd2a.jpg">
</body>
</html>
基于wsgiref自定义web框架
服务端 |
---|
from wsgiref.simple_server import make_server
def run(env, response):
print(env)
response('200 OK', [('Content-type', 'text/html')])
return [b'hello zls web']
if __name__ == '__main__':
ser = make_server('127.0.0.1', 8003, run)
ser.serve_forever()


取出uri |
---|

from wsgiref.simple_server import make_server
def index(env):
return 'index'
def zls_time(env):
return 'zls_time'
def error(env):
return '404'
urls = [
('/', index),
('/time', zls_time),
]
def run(env, response):
response('200 OK', [('Content-type', 'text/html')])
uri = env['PATH_INFO']
func = None
for url in urls:
if uri == url[0]:
func = url[1]
break
if func:
response = func(env)
else:
response = error(env)
return [response.encode('utf-8')]
if __name__ == '__main__':
ser = make_server('127.0.0.1', 8003, run)
ser.serve_forever()



分开路由 |
---|
wsgiServer.py
from wsgiref.simple_server import make_server
from url import urls
from views import error
def run(env, response):
response('200 OK', [('Content-type', 'text/html')])
uri = env['PATH_INFO']
func = None
for url in urls:
if uri == url[0]:
func = url[1]
break
if func:
response = func(env)
else:
response = error(env)
return [response.encode('utf-8')]
if __name__ == '__main__':
ser = make_server('127.0.0.1', 8003, run)
ser.serve_forever()
views.py
def index(env):
return 'index'
def zls_time(env):
return 'zls_time'
def error(env):
return '404'
url.py
from views import *
urls = [
('/', index),
('/time', zls_time),
]
创建一个存放HTML的目录 |
---|
index.html
<!DOCTYPE html>
<html lang="zh-Hans">
<head>
<meta charset="UTF-8">
<title>曾老湿index</title>
</head>
<body>
<h1>曾老湿 index 页面</h1>
<img src="https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1591892187097&di=acd00d338f39e4d31aae486db1b53ec7&imgtype=0&src=http%3A%2F%2Fb.hiphotos.baidu.com%2Fzhidao%2Fpic%2Fitem%2F279759ee3d6d55fb0b6e354e6b224f4a20a4dd2a.jpg">
</body>
</html>
views.py
def index(env):
with open('templates/index.html','r') as f:
data=f.read()
return data
def zls_time(env):
return 'zls_time'
def error(env):
return '404'

动态请求 |
---|
time.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>曾老湿time</title>
</head>
<body>
<div>
{{ time }}
</div>
</body>
</html>
views.py
import datetime
def index(env):
with open('templates/index.html', 'r') as f:
data = f.read()
return data
def zls_time(env):
ctime = datetime.datetime.now().strftime('%Y-%m-%d %X')
with open('templates/time.html', 'r') as f:
data = f.read()
data = data.replace('{{ time }}', ctime)
return data
def error(env):
return '404'
上面代码我们手动替换的页面。
使用jinja2渲染页面 |
---|
安装jinja2

views.py
import datetime
from jinja2 import Template
def index(env):
with open('templates/index.html', 'r') as f:
data = f.read()
return data
def zls_time(env):
ctime = datetime.datetime.now().strftime('%Y-%m-%d %X')
with open('templates/time.html', 'r') as f:
data = f.read()
data = data.replace('{{ time }}', ctime)
return data
def test(env):
with open('templates/test.html', 'r') as f:
data = f.read()
tem = Template(data)
response = tem.render(user={'name': 'zls', 'age': 18})
return response
def error(env):
return '404'
url.py
from views import *
urls = [
('/', index),
('/time', zls_time),
('/test',test)
]
test.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>曾老湿 test web</title>
</head>
<body>
{{user.name}}
{{user.age}}
</body>
</html>

从数据库中取出数据渲染页面
url输入user拿出用户 |
---|
url.py
from views import *
urls = [
('/', index),
('/time', zls_time),
('/test',test),
('/user',user),
]
views.py
import datetime
from jinja2 import Template
import pymysql
def index(env):
with open('templates/index.html', 'r') as f:
data = f.read()
return data
def zls_time(env):
ctime = datetime.datetime.now().strftime('%Y-%m-%d %X')
with open('templates/time.html', 'r') as f:
data = f.read()
data = data.replace('{{ time }}', ctime)
return data
def test(env):
with open('templates/test.html', 'r') as f:
data = f.read()
tem = Template(data)
response = tem.render(user={'name': 'zls', 'age': 18})
return response
def user(env):
conn = pymysql.connect(host='10.0.0.51', port=3306, user='zls', password='123', database='zls')
cursor=conn.cursor(pymysql.cursors.DictCursor)
cursor.execute('select * from zls.user')
dic=cursor.fetchall()
print(dic)
with open('templates/user.html', 'r') as f:
data = f.read()
tem = Template(data)
response = tem.render(user_list=dic)
return response
def error(env):
return '404'
user.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>曾老湿 MySQL User页面</title>
</head>
<body>
<table border="1">
<thead>
<tr>
<th>id</th>
<th>名字</th>
<th>年龄</th>
</tr>
</thead>
<tbody>
{% for user in user_list %}
<tr>
<td>{{user.id}}</td>
<td>{{user.name}}</td>
<td>{{user.age}}</td>
</tr>
{% endfor %}
</tbody>
</table>
</body>
</html>

修改数据库,在再查看页面
mysql> insert into zls.user values(3,'lxx',73);

Django安装
安装方式 |
---|
Django官方网站:TP
1.方法一
(venv) bash-3.2$ pip3 install Django==1.11.18

2.方法二

创建Django项目
命令创建项目 |
---|
# 进入目录
MacBook-pro:PYTHON driverzeng$ cd /Users/driverzeng/Desktop/PYTHON
#创建项目
MacBook-pro:PYTHON driverzeng$ django-admin startproject myfirstdjango


创建项目不够,还需要创建app,也就是不同的功能模块
# 进入到Django项目目录下
MacBook-pro:PYTHON driverzeng$ cd /Users/driverzeng/Desktop/PYTHON/myfirstdjango
# 创建app01
MacBook-pro:myfirstdjango driverzeng$ python3 manage.py startapp app01

使用pycharm打开项目
注意: 1.项目的路径不能有中文 2.计算机名字不能有中文 3.一个工程就是一个项目

# 项目入口,执行一些命令
manage.py
# myfirstdjango 项目
settings.py
urls:总路由,请求地址跟视图函数映射关系
# app01
migrations:数据库迁移的记录
models.py:数据库表模型
views.py:视图函数
图形化创建项目:推荐 |
---|

启动项目 |
---|
方法一:
MacBook-pro:myfirstdjango driverzeng$ python3 manage.py runserver 127.0.0.1:8001

方法二:

写第一个页面
urls.py
"""zlsdjango URL Configuration
The `urlpatterns` list routes URLs to views. For more information please see:
https://docs.djangoproject.com/en/1.11/topics/http/urls/
Examples:
Function views
1. Add an import: from my_app import views
2. Add a URL to urlpatterns: url(r'^$', views.home, name='home')
Class-based views
1. Add an import: from other_app.views import Home
2. Add a URL to urlpatterns: url(r'^$', Home.as_view(), name='home')
Including another URLconf
1. Import the include() function: from django.conf.urls import url, include
2. Add a URL to urlpatterns: url(r'^blog/', include('blog.urls'))
"""
from django.conf.urls import url
from django.contrib import admin
from app01.views import *
urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'index/', index),
]
views.py
from django.shortcuts import render,HttpResponse,redirect
# Create your views here.
def index(request):
return render(request,'index.html',{'name':'zls'})
index.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>曾老湿第一个Django页面</title>
</head>
<body>
{{ name }}
</body>
</html>


Django请求的生命周期

相关文章
- 一个提供公告和打赏功能的 django 应用插件 django-tctip
- vue django mysql_Python MySQL
- Django如何处理URL请求
- Python进阶30-Django AJAX
- 使用pycharm创建Django项目[通俗易懂]
- pycharm django环境搭建_创建web项目
- Django-缓存内容
- Django的ORM操作-删除数据
- pycharm django环境搭建_IDEA如何创建项目
- Django 使用 django-redis 作为缓存的正确用法,别忽略缓存的使用原则
- Django 中使用 ajax 请求的正确姿势
- Django学习笔记一初识Django
- Python进阶31-Django 分页器
- pycharm怎么配置django环境_pycharm环境搭建
- Django的ORM操作-创建数据
- Django默认控制面板增加module
- pycharm运行环境配置_pycharm安装django
- Python进阶32-Django forms组件
- 一次完整的 Django 项目的迁移,有关 MySQL 数据库的导出与导入
- 使用 Django 的 admin 定制后台,丰富自己网站的后台管理系统