纯手工写web框架

python-------------------------web框架

前端与数据库交互的桥梁

软件开发架构

cs架构
bs架构
#本质也是cs

1、day_01

#HTTP
        网络协议  数据传输明文
        HTTPS
        网络协议  加密传输
        websocket   数据加密传输
   四点特向:
        1、基于请求响应
        2、基于tcp,ip作用应用层
        3、无状态
        4、短/无连接
   数据格式:
   响应状态码
  #如何做到后缀不同得到不同的返回内容:
	1、拿到用户的后缀 做判断:
    
    


# web服务端
import socket

server = socket.socket()  # tcp 三次握手,四次挥手
server.bind(('127.0.0.1', 8081))
server.listen(5)  # 监听池

while True:
    conn, add = server.accept()
    data = conn.recv(1024)
    print(data)
    conn.send(b"HTTP/1.1 200 OK\r\n\rhellow web")
    conn.close()
    
#b'GET / HTTP/1.1\r\n
Host: 127.0.0.1:8081\r\
        nConnection: keep-alive\r\
            nCache-Control: max-age=0\r\
                nsec-ch-ua: " Not;A Brand";v="99", "Microsoft Edge";v="91", "Chromium";v="91"\r\n
                    sec-ch-ua-mobile: ?0\r\n
                        Upgrade-Insecure-Requests: 1\r\nUser-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.77 Safari/537.36 Edg/91.0.864.41\r\n
                                Accept: 
                                    
                                    
#
b'GET /index HTTP/1.1\r\n
Host: 127.0.0.1:8081\r\nConnection: keep-alive\r\nsec-ch-ua: " Not;A Brand";v="99", "Microsoft Edge";v="91", "Chromium";v="91"\r\n




# web服务端
import socket

server = socket.socket()  # tcp 三次握手,四次挥手
server.bind(('127.0.0.1', 8081))
server.listen(5)  # 监听池

while True:
    conn, add = server.accept()
    data = conn.recv(1024)

    data.decode("utf-8")
    conn.send(b"http/1.1 200 OK\r\n\r yyy ")
    with open(r'My_g.html', 'rb') as f:
        conn.send(f.read())
    # 获取字符串的特定内容
    current_path = data.split()
    print(current_path)

    if current_path == "/index":
        conn.send(b"hehehehe")
    elif current_path == "/login":
        conn.send(b"heheheheyyyy")

    conn.send(b"hellow webiiiii")
    conn.close()


以上不足之处:

1、代码重复
2、手动处理http格式(数据格式一样,所以处理也大致一样)
3、并发为解决

1、借助wsgiref模块:
ursl.py  路由与视图函数对应关系

views.py  视图函数

templates文件夹   存储HTML文件

#按照功能拆分之后 ,后续添加即可

from wsgiref.simple_server import make_server
from urls import *



def run(env, response):
    '''

    :param env: 请求的所有数据
    :param response: 响应2的所有数据
    :return: 返回给浏览器的数据
    '''
    print(env)  # 大字典,已经处理好了http   'GET', 'PATH_INFO': '/','GET', 'PATH_INFO': '/favicon.ico'
    response('200 OK', [])
    current_path = env.get("PATH_INFO")
    # if current_path == "/index":
    #    return [b'index']
    # elif current_path == "/login":
    #    return [b'login']
    # else:
    #    return [b'404']
    # 提前第一存储匹配的到函数
    func = None
    for url in urls:
        if current_path == url[0]:
            func = url[1]
            break  # 结束
    if func is None:
        res = "404"
    else:
        res = func(env)

    return [res.encode("utf-8")]



if __name__ == "__main__":
    server = make_server("127.0.0.1", 8080, run)  # 实时接听改地址,只要有客户端来了,交给run函数运行,如果是对象也一样
    server.serve_forever()

views:
import datetime


def index(env):
    return 'index'


def login(env):
    return 'login'


def fun_xxx(env):
    with open(r'temples_html/My_g.html', 'r', encoding="utf-8") as f:
        res = f.read()
    return res


def get_time(env):
    curent_time = datetime.datetime.now().strftime('%Y-%m-%d %X')

    with open(r'temples_html/get_time_1.html', 'r', encoding='utf-8') as f:
        data = f.read()
        # data 字符串
        data = data.replace('sssssss', curent_time)  # 先处理好之后再发给前端
        return data
urls:
from views import *
# url 与函数对应关系


urls = [
    ('/index', index),
    ('/login', login),
    ('/xxx',fun_xxx),
    ('/time',get_time)
]
2、动静态网页:
"""
静态网页:内容写死
动态网页:数据实时获取
	eg:
		1、时间展示
		2、数据库获取数据
"""
3、模板语法jinja2模块
简介 
   Jinja2是Python下一个被广泛应用的模版引擎,他的设计思想来源于Django的模板引擎,并扩展了其语法和一系列强大的功能。其中最显著的一个是增加了沙箱执行功能和可选的自动转义功能,这对大多应用的安全性来说是非常重要的。
    他基于unicode并能在python2.4之后的版本运行,包括python3。 [1] 
特性 
  沙箱执行模式,模板的每个部分都在引擎的监督之下执行,模板将会被明确地标记在白名单或黑名单内,这样对于那些不信任的模板也可以执行。
   强大的自动HTML转义系统,可以有效地阻止跨站脚本攻击。
   模板继承机制,此机制可以使得所有的模板都具有相似一致的布局,也方便了开发人员对模板的修改和管理。
   高效的执行效率,Jinja2引擎在模板第一次加载时就把源码转换成Python字节码,加快模板执行时间。
   可选的预编译模式。
   调试系统融合了标准的Python的TrackBack系统,使得模板编译和运行期间的错误能及时被发现和调试。
   语法可配置,可以重新配置Jinja2使得它更好地适应LaTeX或JavaScript的输出。
   模板设计人员帮助手册,此手册指导设计人员更好地使用Jinja2引擎的各种方法。 [1] 
   
def get_dict(env):
    user_dir = {'username':'jason','age':18}
    with open(r'temples_html/get_dict.html','r',encoding="utf-8") as f:
        data = f.read()
    tmp = Template(data)
    res = tmp.render(user=user_dir) # 给get_dict.html传递一个值,页面上通过user就能拿到user_dict
    return res

#后端获取数据库展示到前端页面


 <table class="table table-hover table-striped">
                <thead>
                    <tr>
                        <th>ID</th>
                        <th>username</th>
                        <th>password</th>
                        <th>hobby</th>
                    </tr>
                </thead>
                <tbody>
                {% for user_dict in user_list %}
                    <tr>
                        <td>{{ user_dict.id}}</td>
                        <td>{{ user_dict.username}}</td>
                        <td>{{ user_dict.password}}</td>
                        <td>{{ user_dict.hobby}}</td>
                    </tr>
                 {% endfor%}
                </tbody>
                
                
 def get_user(env):
    pass
    #取数据:
    conn = pymysql.connect(
        host='180.76.161.20',
        port = 3306,
        user = 'root',
        password = "123456",
        db='My_Try_Value',
        charset="utf8",
        autocommit=True
    )
    cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)
    sql = "select * from useinfor"
    affect_row  = cursor.execute(sql)
    data_list = cursor.fetchall()  #[{},{}]
    with open(r'temples_html/get_data.html','r',encoding="utf-8") as f:
        data = f.read()
    tem = Template(data)
    res = tem.render(user_list = data_list)
    return res

#模块语法(贴近py语法)
{{  user  }}
{{user.get('username')}}
{{user.age }}
{{user['happy']}}
4、简易web框架流程:
"""
wsgiref模块
	1、请求时来的http数据,封装大字典
	2、响应走的时候的数据打包成符合http格式
"""

在这里插入图片描述

5、python三大主流web框架
"""
django
	特点:大而全,功能强大
	不足:
		有时候过于笨重(小型项目用不到)
		
flash
	特点:小而经  自带功能特别的小  类似与游骑兵
	第三方的模块多(辅助,如果flash第三方模块加起来完全可以盖过djongo,而且很像)
	不足:
		比较依赖与第三方的开发者
		
tornado
	特点:异步非阻塞,支持高并发
	牛逼:可以开发游戏服务器
	不足:
		暂时:不会
"""

三部分:
A:socket
B:路由与视图对应关系
c:模板语法
    
django:
 A,wsgiref
 B,自己
 c,自己的,没有jinja2好用

flash
 A,别人werzeug
    B,自己
    c,jinja2
torndo
	a、b、c都自己的


6、注意事项
# 如何让计算机正常启动
	1、计算机的名称不能有中文
    2、一个pycham只能开一个项目
    3、项目名所有文件尽量不要出现中文
    4、python解释器用3.4-3.6
    	如果项目报错,点击之后一个报错信息,把源码中的逗号删掉
#django版本问题:
	1.x 2.x 3.x(忽略)
    1.2巨多,差距也不大,主要以1.x为例 
    
#django按照
pip3 install djang==1.11.11
如果已经安装了其他版本,无需卸载
会直接重新装,自动卸载安装新的
验证安装成功:1、
				终端输入django-admin

在这里插入图片描述

7、django基本操作:

#命令行操作()
	#1、创建django项目:
		先切换到对应盘
		D:
		1\django-admin startproject 项目名
			结构层次
			manage.py
			mysite文件夹
			 	settings.py
			 	__init__.py
			 	ursl.py
			 	wsgi.py
			 	
	2\启动
    """
    cd /mysite
    """
    python3 manage.py runserver
    CTRL+c停止运行
    
    3\创建应用:
	Next, start your first app by running python manage.py startapp [app_label].
	
	 python manage.py startapp app01
	 应用名,简明之一
	 user
	 order

#pycham操作
启动出错
	
TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [BASE_DIR ,'templates']  \变,
        ,
        'APP_DIRS': True,
   创建应用
   		1、pycham终端命令
   		2、run manage.py T
   		
   3、手动注册app
   /***********************************************重要****************************************************/
   setings.py下
   INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'app02.apps.App01Config'
    # 简写: ‘app02’
]
ps,pycham创建时可以帮你创建仅一个app并注册好
       / *******************************************************/

4、添加路劲(命令行,终端)
        [os.path.join(BASE_DIR,'templates')]
        



启动成功结果:

(day_001) F:\web_project\mysite>python manage.py runserver
Performing system checks...

System check identified no issues (0 silenced).

You have 13 unapplied migration(s). Your project may not work properly until you apply the migrations for app(s): a
dmin, auth, contenttypes, sessions.
Run 'python manage.py migrate' to apply them.
June 13, 2021 - 16:25:40
Django version 1.11.2, using settings 'mysite.settings'
Starting development server at http://127.0.0.1:8000/
Quit the server with CTRL-BREAK.
[13/Jun/2021 16:25:58] "GET / HTTP/1.1" 200 1716
Not Found: /favicon.ico
[13/Jun/2021 16:25:58] "GET /favicon.ico HTTP/1.1" 404 1962


[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

命令行与pycham创建区别

命令行创建
TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [BASE_DIR ,'templates']
        ,
        'APP_DIRS': True,
        'OPTIONS': {
            'context_processors': [
                'django.template.context_processors.debug',
                'django.template.context_processors.request',
                'django.contrib.auth.context_processors.auth',
                'django.contrib.messages.context_processors.messages',
            ],
        },
    },
]

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

7、应用:
django专门开发app的框架
django类似与一所大学
	app类似与各个学院:
	比如:
	一个app就是一个独立的app
	
8、主要文件简介
-mysite项目文件
	--mysite文件夹
		---settings.py 配置文件
		---urls.py 路由与视图
		---wsgi.py    wsgiref模块
	--manage.py  django人口文件
	--db.sqlites  djang0自带的数据库(小型,功能不是很多,有bug)
	--appo1
		---admin.py    django后台管理
		---apps.py     注册使用
		---migrations文件夹   数据库迁移记录
		---models.py   数据库相关的  模型类(orm)
		---tests.py  测试文件
		---views.py  视图文件

9、django小白必会3板斧

usrl中
from django.contrib import admin
from app02 import views

urlpatterns = [
    url(r'^admin/', admin.site.urls),
    #写我们自己的;
url(r'^index/', views.index),
]
"""
views中
HttpResponse
返回字符串
        from django.shortcuts import render ,HttpResponse,redirect

        # Create your views here.

        def index(request):
            """

            :param request: 请求数据,比env对象
            :return:
            """
            return HttpResponse('HTML^^^^^^')

render

	return render(request,'MY_Fist.html')  #配置文件作用下查找,返回HTML文件

redirect
	重定向
	 return redirect("http://www.mzitu.com/")  # 网页跳转 //本django网页,自己的网页时可以直接写后缀名
"""
(r’^admin/, admin.site.urls),
#写我们自己的;
url(r’^index/, views.index),
]
“”"
views中
HttpResponse
返回字符串
from django.shortcuts import render ,HttpResponse,redirect
```python




        # Create your views here.

        def index(request):
            """

            :param request: 请求数据,比env对象
            :return:
            """
            return HttpResponse('HTML^^^^^^')

render

	return render(request,'MY_Fist.html')  #配置文件作用下查找,返回HTML文件

redirect
	重定向
	 return redirect("http://www.mzitu.com/")  # 网页跳转 //本django网页,自己的网页时可以直接写后缀名
"""
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值