首页 > Web开发 > 详细

web框架入门

时间:2019-10-20 17:08:09      阅读:60      评论:0      收藏:0      [点我收藏+]

1. HTTP协议

超文本传输协议:
1.四大特性
    1.基于TCP/IP之上作用于应用层
    2.基于请求响应
    3.无状态   cookies  session  token
    4.无连接
        长连接  websocket(HTTP协议的大补丁)
        
2.数据格式
    请求格式
        请求首行(请求方式,协议版本...)
        请求头(一大堆k:v键值对)
        \r\n
        请求体(真正的数据 发post请求时才有 如果是get请求不会有)
        响应首行
        响应头
        \r\n
        响应体
        
3.响应状态码
    用特定的数字表示一些意思
    1xx:服务端已经成功接收到了你的数据 正在处理 你可以继续提交其他数据
    2xx:服务端成功响应(200请求成功)
    3xx:重定向
    4xx:请求错误(404:请求资源不存在  403:拒绝访问)
    5xx:服务器内部错误(500)

2. 请求方式

get请求:朝别人要数据
post请求:向别人提交数据(eg:用户登录)

url:统一资源定位器

3. 纯手写web框架

import socket

server = socket.socket()
server.bind(('127.0.0.1', 8001))
server.listen(5)

'''
请求首行
b'GET / HTTP/1.1\r\n
请求头
Host: 127.0.0.1:8888\r\n
Connection: keep-alive\r\n
Cache-Control: max-age=0\r\n
Upgrade-Insecure-Requests: 1\r\n
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.132 Safari/537.36\r\n
Sec-Fetch-Mode: navigate\r\n
Sec-Fetch-User: ?1\r\n
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3\r\n
Sec-Fetch-Site: none\r\n
Accept-Encoding: gzip, deflate, br\r\n
Accept-Language: zh-CN,zh;q=0.9\r\n
\r\n
请求体
'

'''

while True:
    conn, addr = server.accept()
    data = conn.recv(1024)
    # print(data)
    conn.send(b'HTTP/1.1 200 OK\r\n\r\n')
    data = data.decode('utf8')
    current_path = data.split('\r\n')[0].split(' ')[1]
    # print(current_path)
    if current_path == '/index':
        with open(r'F:\实习\python\1018\web框架推导\templates\index.html', 'rb') as f:
            conn.send(f.read())
    elif current_path == '/login':
        conn.send(b'login')
    else:
        conn.send(b'404 error')
    conn.close()

4. 基于wegiref模块

# urls.py  路由与视图函数对象关系
# views.py  放的是视图函数(处理业务逻辑的)
# templates  模板文件夹(一堆html文件)

# urls.py
from views import *

urls = [
    ('/index',index),
    ('/login',login),
    ('/xxx',xxx),
    ('/get_time',get_time),
    ('/get_user',get_user),
    ('/get_db',get_db)
]


# views.py
import datetime
from jinja2 import Template

def index(env):
    return 'index'

def login(env):
    return 'login'

def error(env):
    return '404 error'

def xxx(env):
    return 'xxx'

def get_time(env):
    time = datetime.datetime.now().strftime('%Y-%m-%d %X')
    with open(r'F:\实习\python\1018\web框架推导\templates\get_time.html','r',encoding='utf8')as f:
        data = f.read()
    data = data.replace('$$time$$',time)
    return data

def get_user(env):
    d = {'name':'aa','pwd':'123','hobby':['read','running','music']}
    with open(r'F:\实习\python\1018\web框架推导\templates\get_user.html','r',encoding='utf8') as f:
        data = f.read()
    temp = Template(data)
    res = temp.render(user=d)   # 将字典d传递给前端页面 页面上通过变量名user就能够获取到该字典
    return res


# 基于wsgiref.py
import pymysql
def get_db(env):
    conn = pymysql.connect(
        host = '127.0.0.1',
        user = 'root',
        password = 'root',
        database = 'db926',
        port = 3306,
        charset = 'utf8',
        autocommit = True,
    )
    cursor = conn.cursor(pymysql.cursors.DictCursor)
    sql = 'select * from bank'
    cursor.execute(sql)
    res = cursor.fetchall()
    print(res)
    with open(r'F:\实习\python\1018\web框架推导\templates\get_db.html','r',encoding='utf8') as f:
        data = f.read()
    temp = Template(data)
    res1 = temp.render(info_list = res)
    return res1

from wsgiref.simple_server import make_server
from urls import urls
from views import error


def run(env, response):
    """
    :param env: 请求相关的所有数据
    :param response: 响应相关的所有数据
    :return
    """
    response('200 OK', [])
    current_path = env.get('PATH_INFO')
    func = None
    # for循环 匹配后缀
    for url in urls:
        if current_path == url[0]:
            func = url[1]   # 一旦匹配成功 就将匹配到的函数名赋值给func变量
            break   # 主动结束匹配
    # 判断func是否有值
    if func:
        res = func(env)
    else:
        res = error(env)
    return [res.encode('utf8')]


if __name__ == '__main__':
    server = make_server('127.0.0.1', 8000, run)
    # 实时监听该地址  只要有客户端来连接 统一交给run函数去处理
    server.serve_forever()

5. 动静态网页

静态网页:数据是写死的 万年不变

动态网页
数据是实时获取的
eg:
1.后端获取当前时间展示到前端
2.后端获取数据库中的数据展示到前端

后端获取的数据 传递给html页面 >>>: 模板的渲染

jinja2

模板语法(极其贴近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 %}

6. python三大主流web框架

Django:
    大而全 自带的功能特别特别多 类似于航空母舰
    有时候过于笨重
    
Flask
    小而精 自带的功能特别特别少 类似于游骑兵
    第三方的模块特别特别多,如果将flask第三方模块全部加起来 完全可以超过django
    比较依赖于第三方模块
    
Tornado
    异步非阻塞
    牛逼到可以开发游戏服务器
        
        
A:socket部分
B:路由与视图函数对应关系
C:模板语法
    
Django:
    A用的别人的  wsgiref
    B自己写的
    C自己写的
Flask
    A用的别人的  werkzeug(基于wsgiref)
    B自己写的
    C用的别人的  jinja2
Tornado
    三者全是自己写的

注意事项
    1.计算机的名称不能有中文
    2.一个pycharm窗口就是一个项目
    3.项目名里面尽量不要用中文
    
django安装
    pip3 install django==1.11.11
    
验证django是否安装成功
    命令行直接敲django-admin
    
一个django项目就类似于是一所大学,而app就类似于大学里面的学院
django其实就是用来一个个应用的
一个app就相当于一块独立的功能
    用户功能
    管理功能
django支持任意多个app

如何使用:
1.命令行使用
    创建django项目
        django-admin startproject mysite
    启动django项目
        python manage.py runserver
    创建应用app
        python manage.py startapp app01
            
注意:
    1.新创建的app需要去settings配置文件中手动在TEMPLATES写配置: os.path.join(BASE_DIR, 'templates')
    2.pycharm只会帮你注册第一个你在创建项目的时候写的应用
    3.使用命令行创建django项目 不会自动帮你创建templates文件夹只能自己创建
  

2.pycharm使用
    在启动django项目的时候 你一定要确保一个端口只有一个django项目
   
项目名
    跟项目名同名的文件夹
        settings.py  暴露给用户的配置文件
        urls.py  路由与视图函数对应关系
    应用名
        migrations文件夹  存放数据库迁移记录的
        admin.py  django后台管理
        apps.py  注册相关
        models.py  模型类 
        tests.py  测试文件
        views.py  存放视图函数
    templates文件夹  存放html文件
    manage.py  django入口文件

web框架入门

原文:https://www.cnblogs.com/yushan1/p/11707878.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!