• web框架


    1.web框架的本质

    在web浏览中, 浏览器相当于客户端, 对web的操作相当于编写服务器
    最基本的web服务器代码为
    import socket
    server=socket.socket()
    server.bind(('127.0.0.1',8080))
    server.listen(5)
    
    while True:
        conn,addr=server.accept()
        data=conn.recv(1024)
        conn.send('HTTP1.1/1.1 200 OK 
    
    '.encode('utf8'))
        conn.send('hello world'.encode('utf8'))
        conn.close()
    

    解析HTTP的请求报文

    请求头和请求体用 分割

    请求头中的每一行用 分割

     

    2.基本框架的改进

    (1)限制URL

    通过分析请求头,获得请求头的URL,用URL来返回不同的数据

    import socket
    server=socket.socket()
    server.bind(('127.0.0.1',8080))
    server.listen(5)
    
    while True:
        conn,addr=server.accept()
        data=conn.recv(1024).decode('utf8')
        header,bodys=data.split('
    
    ')
        ##请求头与请求体用
    
    分割
        headerlist=header.split('
    ')
        ##请求头以
    分割
        method,url,protocal=headerlist[0].split(' ')
        ##获取请求头的首行
        conn.send('HTTP1.1/1.1 200 OK 
    
    '.encode('utf8'))
        if url=='/index':
            conn.send('main page'.encode('utf8'))
            ##限制URL
        else:
            conn.send('404'.encode('utf8'))

    (2)将URL封装

    import socket
    server=socket.socket()
    server.bind(('127.0.0.1',8080))
    server.listen(5)
    
    def f1():
        conn.send('main page'.encode('utf8'))
    
    def f2():
        conn.send('hello world'.encode('utf8'))
    
    routers=[
        ('/index',f1),
        ('/hi',f2)
    ]
    while True:
        conn,addr=server.accept()
        data=conn.recv(1024).decode('utf8')
        header,bodys = data.split('
    
    ')
        headerlist = header.split('
    ')
        method, url, protocal = headerlist[0].split(' ')
        conn.send('HTTP1.1/1.1 200 OK 
    
    '.encode('utf8'))
        func_name=None
        for item in routers:
            if item[0]==url:
                func_name=item[1]##限制URL,对应字典中的value,触发函数的执行
                break
        if func_name:
            func_name()
        else:
            conn.send('404'.encode('utf8'))
        conn.close()
    

    (3)通过读取文件返回HTML页面

    def f3():
        with open('login.html','rb')as f:
            conn.send(f.read())
    
    routers=[
        ('/index',f1),
        ('/hi',f2),
        ('/wapper',f3)
    ]
    

    (4)通过替换特殊字符串来动态返回HTML页面

    def f4():
        with open('login.html','rb')as f:
            data=f.read()
        import time
        ctime=time.time()
        data=data.replace(b'@@@ctime@@@',b'ctime')
        conn.send(data)
    routers=[
        ('/index',f1),
        ('/hi',f2),
        ('/wapper',f3),
        ('/time',f4)
    ]
    

    (5)读取数据库的表,获得数据库的数据并显示

    (6)使用jinjia2来替换动态内容

     

    3.框架的分类

    4.Django框架

    4.1创建基本Django项目

    (1)安装

    pip3 install django
       
    添加环境变量
    一般安装到Python的scripts的文件夹下
    将scripts文件夹添加到环境变量
    C:Python36Scriptsdjango-admin

    创建一个项目

    django-admin startproject 项目名
    

    进入该项目目录中

    python manage.py runserver IP地址:端口
    

    如果不带上IP地址和端口, 默认是本地地址, 端口为8000

     

    4.2用IDE创建Django项目

    项目结构相同
    │  db.sqlite3
    │  manage.py          项目启动管理PY文件

    └─项目名
        │  settings.py        项目配置文件
        │  urls.py                路由配置
        │  wsgi.py                
        │  __init__.py
        │
        └─__pycache__
     
    (1)配置URL urls.py
    urlpatterns = [
        # url(r'^admin/', admin.site.urls),
        url(r'^login/', login),##后面一定要加逗号!!
    ]
    

    (2)配置处理 函数urls.py

    from django.conf.urls import url
    from django.contrib import admin
    
    from django.shortcuts import HttpResponse,render,redirect
    def login(request):#处理用户请求 并且返回结果
    #至少有一个参数
    # request 用户请求相关的所有信息(对象)
    
        # return HttpResponse('login')    #HttpResponse里面只能加字符串
    # 返回用户所需要的信息
        # return HttpResponse('<input>')#也可以返回一个标签,或者文件
        if request.method=="GET":
            return render(request,'login.html')
        else:
            print(request.POST)#用户名密码字典都放在POST里面
        #获取
            u=request.POST.get("username")
            p=request.POST.get("password")
            if u=="root" and p=="123123":
                return redirect('http://www.oldboyedu.com/')##跳转地址
                #登录成功
            else:
                return render(request,'login.html',{'msg':'用户名或密码错误'})
                #登录失败
    #render默认自动查找模板路径下的login.html文件
    #读取内容并返回给用户
    

    (3)使用render的模板文件配置settings.py

    'DIRS': [os.path.join(BASE_DIR, 'templates')]
     一般地, 模板文件放在templates文件中, 配置这个之后就能找到该文件了
     
    (4)配置静态文件目录 settings.py
    <link rel="stylesheet" href="/static/com.css">
     --STATIC_URL = '/static/'
     STATICFILES_DIRS=(
         os.path.join(BASE_DIR,'sta'),
     )
    
  • 相关阅读:
    mybatis 查询list,内容为null,但list的size 为1
    mysql 父子表 注意事项
    导入
    php生成签名及验证签名
    PHP通过OpenSSL生成证书、密钥并且加密解密数据,以及公钥,私钥和数字签名的理解
    PHP 做 RSA 签名 生成订单(支付宝例子)
    接口安全调用该怎么做?签名?证书?服务安全?
    PHP 以POST方式提交XML、获取XML,最后解析XML
    php 解析xml 的四种方法
    php 模拟POST提交的2种方法
  • 原文地址:https://www.cnblogs.com/asaka/p/7011509.html
Copyright © 2020-2023  润新知