一,web框架的本质

web应用的本质就是一个socket的服务端。而用户的浏览器就是一个客户端,具体事例如下:

import socket
sk = socket.socket()
sk.bind(('127.0.0.1', 8090))
sk.listen() while 1:
conn,addr=sk.accept()
conn.recv(9000)
conn.send(b'HTTP/1.1 200 ok\r\n\r\n')#必须写上这一句,才可以,只限英文,如果是中文还需要加上别的
conn.send(b'ok')
conn.close()

对于真实开发中python web程序来说,一般分为两部分,服务器程序和应用程序

服务器程序负责对socket服务器进行封装,并在请求到来时,对请求的各种数据进行整理。

应用程序则负责具体的逻辑处理。为了方便应用程序的开发,就出现了众多的Web框架,例如:Django、Flask、web.py 等。不同的框架有不同的开发方式,但是无论如何,开发出的应用程序都要和服务器程序配合,才能为用户提供服务。

这样,服务器程序就需要为不同的框架提供不同的支持。这样混乱的局面无论对于服务器还是框架,都是不好的。对服务器来说,需要支持各种不同框架,对框架来说,只有支持它的服务器才能被开发出的应用使用。

这时候,标准化就变得尤为重要。我们可以设立一个标准,只要服务器程序支持这个标准,框架也支持这个标准,那么他们就可以配合使用。一旦标准确定,双方各自实现。这样,服务器可以支持更多支持标准的框架,框架也可以使用更多支持标准的服务器。

WSGI(Web Server Gateway Interface)就是一种规范,它定义了使用Python编写的web应用程序与web服务器程序之间的接口格式,实现web应用程序与web服务器程序间的解耦。

常用的WSGI服务器有uwsgi、Gunicorn。而Python标准库提供的独立WSGI服务器叫wsgiref,Django开发环境用的就是这个模块来做服务器。

import socket
sk = socket.socket()
sk.bind(('127.0.0.1', 8090))
sk.listen() while 1:
conn,addr=sk.accept()
info=conn.recv(9000).decode("utf-8") a=info.split("\r\n")[0]
a1=a.split()[1]
print(a1)
if a1=="/index/":
response=b'insex'
else:response = b"404 not found!" conn.send(b'HTTP/1.1 200 ok\r\n\r\n')#必须写上这一句,才可以,只限英文,如果是中文还需要加上别的
conn.send(response)
conn.close()
import socket
sk = socket.socket()
sk.bind(('127.0.0.1', 8090))
sk.listen()
def index(a1):
s="ghghghghghg不讲课"
return bytes(s,encoding="utf-8") while 1:
conn,addr=sk.accept()
info=conn.recv(9000).decode("utf-8") a=info.split("\r\n")[0]
a1=a.split()[1]
print(a1)
if a1=="/index/":
response=index(a1)
else:response = b"404 not found!" conn.send(b'HTTP/1.1 200 ok\r\nContent-Type: text/html; charset=utf-8\r\n\r\n')#必须写上这一句,才可以,只限英文,如果是中文还需要加上别的
conn.send(response)
conn.close()
from wsgiref.simple_server import make_server

def index(a1):
s="ghghghghghg不讲课"
return bytes(s,encoding="utf-8")
def run(environ,start_response):
start_response('200 ok', [('Content-Type', 'text/html; charset=utf-8'),])
a1=environ['PATH_INFO'] if a1:
response=index(a1)
else:response = b"404 not found!"
return [response,] if __name__=='__main__':
httpd=make_server('127.0.0.1',8090,run)
httpd.serve_forever()
from wsgiref.simple_server import make_server

import jinja2

def index(a1):
with open("xiaoqiang.html", "r", encoding="utf8") as f:
s = f.read()
template = jinja2.Template(s) # 生成一个jinja2的Template(模板)对象
data = {"name": "ergou", "hobby_list": ["dd", "rr", "ee"]}
response = template.render(data) # 本质上是完成了字符串的替换
return bytes(response, encoding="utf8") def run(environ,start_response):
start_response('200 ok', [('Content-Type', 'text/html; charset=utf-8'),])
a1=environ['PATH_INFO'] if a1:
response=index(a1)
else:response = b"404 not found!"
return [response,] if __name__=='__main__':
httpd=make_server('127.0.0.1',8090,run)
httpd.serve_forever()
from wsgiref.simple_server import make_server

import jinja2
import pymysql def index(a1):
with open("xiaoqiang.html", "r", encoding="utf8") as f:
s = f.read()
template = jinja2.Template(s) # 生成一个jinja2的Template(模板)对象 conn = pymysql.connect(host="127.0.0.1", port=3306, user="root", passwd="123456", db="userinfo", charset="utf8")
cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)
cursor.execute("SELECT name, hobby FROM info1")
user = cursor.fetchone()
cursor.close()
conn.close()
hobby_list = user["hobby"].split()
user["hobby_list"] = hobby_list response = template.render(user) # 本质上是完成了字符串的替换
return bytes(response, encoding="utf8") def run(environ,start_response):
start_response('200 ok', [('Content-Type', 'text/html; charset=utf-8'),])
a1=environ['PATH_INFO'] if a1:
response=index(a1)
else:response = b"404 not found!"
return [response,] if __name__=='__main__':
httpd=make_server('127.0.0.1',8090,run)
httpd.serve_forever()

Django的静态文件配置

STATIC_URL = '/static/'  # HTML中使用的静态文件夹前缀
STATICFILES_DIRS = [
os.path.join(BASE_DIR, "static"), # 静态文件存放位置
]

Django必备的三个模块

from django.shortcuts import HttpResponse, render, redirect

1,HttpResponse

内部传入一个字符串参数,返回给浏览器。

render

除request参数外还接受一个待渲染的模板文件和一个保存具体数据的字典参数。

将数据填充进模板文件,最后把结果返回给浏览器。

作用类似于jinja2

redirect

接受一个URL参数,表示跳转到指定的URL。

Django基础1的更多相关文章

  1. Python之路-(js正则表达式、前端页面的模板套用、Django基础)

    js正则表达式 前端页面的模板套用 Django基础 js正则表达式: 1.定义正则表达式 /.../  用于定义正则表达式 /.../g 表示全局匹配 /.../i 表示不区分大小写 /.../m ...

  2. Django 基础教程

    Django 基础教程 这是第一篇 Django 简介 »  Django 是由 Python 开发的一个免费的开源网站框架,可以用于快速搭建高性能,优雅的网站! 你一定可以学会,Django 很简单 ...

  3. python的django基础篇

    一.Django基础 Django 是用Python开发的一个免费开源的Web框架,可以用于快速搭建高性能,优雅的网站! Django的特点: 强大的数据库功能:拥有强大的数据库操作接口(QueryS ...

  4. Python学习(二十六)—— Django基础一

    转载自:http://www.cnblogs.com/liwenzhou/p/8258992.html 一.Web框架本质 我们可以这样理解:所有的Web应用本质上就是一个socket服务端,而用户的 ...

  5. Django基础(一)

    Django基础(一) 知识预览 Django基本命令 二 路由配置系统(URLconf) 三 编写视图 四 Template 五 数据库与ORM admin的配置 一 什么是web框架? 框架,即f ...

  6. python3之Django基础篇

    一.Django基础 Django 是用Python开发的一个免费开源的Web框架,可以用于快速搭建高性能,优雅的网站! Django的特点: 强大的数据库功能:拥有强大的数据库操作接口(QueryS ...

  7. DJango 基础 (1)

    django基础 知识点: 基本认知 工具准备 新建项目 目录及文件说明 开发服务器 创建视图函数 新建应用(app) 1.基本认知 Django是用Python开发的一个免费开源的Web框架,可以用 ...

  8. Django基础和基本使用

    Django基础 Django是Python下的一款著名的Web框架 框架 任何语言进入到高级部分时,会有认证.session.http.连接数据库等等功能操作,没有框架时需要自己实现 框架 是整个或 ...

  9. {Django基础十之Form和ModelForm组件}一 Form介绍 二 Form常用字段和插件 三 From所有内置字段 四 字段校验 五 Hook钩子方法 六 进阶补充 七 ModelForm

    Django基础十之Form和ModelForm组件 本节目录 一 Form介绍 二 Form常用字段和插件 三 From所有内置字段 四 字段校验 五 Hook钩子方法 六 进阶补充 七 Model ...

  10. {Django基础九之中间件} 一 前戏 二 中间件介绍 三 自定义中间件 四 中间件的执行流程 五 中间件版登陆认证

    Django基础九之中间件 本节目录 一 前戏 二 中间件介绍 三 自定义中间件 四 中间件的执行流程 五 中间件版登陆认证 六 xxx 七 xxx 八 xxx 一 前戏 我们在前面的课程中已经学会了 ...

随机推荐

  1. Linux centos7 mysql 的安装配置

    2021-07-21 1. 创建用户 # 创建用户useradd mysql# 修改密码 passwd mysql 2. 下载 wget 网址 3. 解压 # 创建安装文件夹mkdir app# 解压 ...

  2. RHCS+Nginx及Fence机制实现高可用集群

    RHCS(Red Hat Cluster Suite,红帽集群套件)是Red Hat公司开发整合的一套综合集群软件组件,提供了集群系统中三种集群构架,分别是高可用性集群.负载均衡集群.存储集群,可以通 ...

  3. 微信小程序基础知识笔记

    微信小程序笔记 文件构成 全局文件 app.json 小程序全局配置文件,必要,自动生成 app.js 小程序入口JS文件,一般只需申明全局变量.处理生命周期以及版本升级即可,必要 app.wxss ...

  4. K8S最小硬件配置

  5. idea配置tomcat及中文乱码解决

    放在前面:不要使用tomcat10,访问自己的页面会报404错误,目前无解,在这个坑爬了一下午,最终换了tomcat 9才解决.所以我选择了tomcat 9 + idea 2021.2版本 配置步骤: ...

  6. 痞子衡嵌入式:MCUXpresso IDE下将关键函数重定向到RAM中执行的几种方法

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家分享的是MCUXpresso IDE下将关键函数重定向到RAM中执行的几种方法. 前段时间痞子衡写了一篇 <在IAR开发环境下将关键函数重 ...

  7. noip模拟19/20

    这两场考试大部分的题都考过,然鹅有的 \(trick\) 忘了,有的当时咕了(虽然现在还咕着) 首先是 \(v\) 这道题需要加一个小优化,对于较小的状态应该直接用数组记录,较大的再用 map 记 然 ...

  8. 7-31 堆栈操作合法性 (20 分) PTA

    7-31 堆栈操作合法性 (20 分)   假设以S和X分别表示入栈和出栈操作.如果根据一个仅由S和X构成的序列,对一个空堆栈进行操作,相应操作均可行(如没有出现删除时栈空)且最后状态也是栈空,则称该 ...

  9. Spring MVC拦截器浅析

    Spring MVC拦截器 重点:Spring MVC的拦截器只会拦截控制器的请求,如果是jsp.js.image.html则会放行. 什么是拦截器 运行在服务器的程序,先于Servlet或JSP之前 ...

  10. system、 exec函数族、fork函数用法说明

    system(), exec函数族, fork函数用法说明 启动一个新线程的方式: system() 该函数经常用来在C程序中调用shell脚本或者命令行程序. 特点: 效率低下,首先需要创建一个sh ...