前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Python进阶25-Django Web框架

Python进阶25-Django Web框架

作者头像
DriverZeng
发布2022-09-26 12:04:01
2950
发布2022-09-26 12:04:01
举报
文章被收录于专栏:Linux云计算及前后端开发

-曾老湿, 江湖人称曾老大。


-多年互联网运维工作经验,曾负责过大规模集群架构自动化运维管理工作。 -擅长Web集群架构与自动化运维,曾负责国内某大型金融公司运维工作。 -devops项目经理兼DBA。 -开发过一套自动化运维平台(功能如下): 1)整合了各个公有云API,自主创建云主机。 2)ELK自动化收集日志功能。 3)Saltstack自动化运维统一配置管理工具。 4)Git、Jenkins自动化代码上线及自动化测试平台。 5)堡垒机,连接Linux、Windows平台及日志审计。 6)SQL执行及审批流程。 7)慢查询日志分析web界面。


基于socket手撸web框架


服务端

代码语言:javascript
复制
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协议

代码语言:javascript
复制
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()


添加响应体

代码语言:javascript
复制
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

代码语言:javascript
复制
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()


获取用户访问路径

代码语言:javascript
复制
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代码

代码语言:javascript
复制
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写入文件

代码语言:javascript
复制
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()
代码语言:javascript
复制
<!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框架


服务端

代码语言:javascript
复制
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

代码语言:javascript
复制
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

代码语言:javascript
复制
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

代码语言:javascript
复制
def index(env):
    return 'index'


def zls_time(env):
    return 'zls_time'


def error(env):
    return '404'

url.py

代码语言:javascript
复制
from views import *

urls = [
    ('/', index),
    ('/time', zls_time),
]

创建一个存放HTML的目录

index.html

代码语言:javascript
复制
<!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

代码语言:javascript
复制
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

代码语言:javascript
复制
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>曾老湿time</title>
</head>
<body>
    <div>
        {{ time }}
    </div>
</body>
</html>

views.py

代码语言:javascript
复制
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

代码语言:javascript
复制
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

代码语言:javascript
复制
from views import *

urls = [
    ('/', index),
    ('/time', zls_time),
    ('/test',test)
]

test.html

代码语言:javascript
复制
<!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

代码语言:javascript
复制
from views import *

urls = [
    ('/', index),
    ('/time', zls_time),
    ('/test',test),
    ('/user',user),
]

views.py

代码语言:javascript
复制
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

代码语言:javascript
复制
<!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>

修改数据库,在再查看页面

代码语言:javascript
复制
mysql> insert into zls.user values(3,'lxx',73);

Django安装


安装方式

Django官方网站:TP

1.方法一

代码语言:javascript
复制
(venv) bash-3.2$ pip3 install Django==1.11.18

2.方法二

创建Django项目


命令创建项目

代码语言:javascript
复制
# 进入目录
MacBook-pro:PYTHON driverzeng$ cd /Users/driverzeng/Desktop/PYTHON

#创建项目
MacBook-pro:PYTHON driverzeng$ django-admin startproject myfirstdjango

创建项目不够,还需要创建app,也就是不同的功能模块

代码语言:javascript
复制
# 进入到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.一个工程就是一个项目

代码语言:javascript
复制
# 项目入口,执行一些命令
manage.py

# myfirstdjango 项目
settings.py
urls:总路由,请求地址跟视图函数映射关系

# app01
migrations:数据库迁移的记录
models.py:数据库表模型
views.py:视图函数

图形化创建项目:推荐


启动项目

方法一:

代码语言:javascript
复制
MacBook-pro:myfirstdjango driverzeng$ python3 manage.py runserver 127.0.0.1:8001

方法二:

写第一个页面

urls.py

代码语言:javascript
复制
"""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

代码语言:javascript
复制
from django.shortcuts import render,HttpResponse,redirect

# Create your views here.
def index(request):
    return render(request,'index.html',{'name':'zls'})

index.html

代码语言:javascript
复制
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>曾老湿第一个Django页面</title>
</head>
<body>
    {{ name }}
</body>
</html>

Django请求的生命周期

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2019-04-29,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 基于socket手撸web框架
  • 基于wsgiref自定义web框架
  • 从数据库中取出数据渲染页面
  • Django安装
  • 创建Django项目
  • 写第一个页面
  • Django请求的生命周期
相关产品与服务
云数据库 MySQL
腾讯云数据库 MySQL(TencentDB for MySQL)为用户提供安全可靠,性能卓越、易于维护的企业级云数据库服务。其具备6大企业级特性,包括企业级定制内核、企业级高可用、企业级高可靠、企业级安全、企业级扩展以及企业级智能运维。通过使用腾讯云数据库 MySQL,可实现分钟级别的数据库部署、弹性扩展以及全自动化的运维管理,不仅经济实惠,而且稳定可靠,易于运维。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档