手动编写一个web简易框架
import socket server = socket.socket() server.bind( ('127.0.0.1', 8080) ) server.listen(5) """ b'GET /index HTTP/1.1 Host: 127.0.0.1:8080 Connection: keep-alive Upgrade-Insecure-Requests: 1 User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.88 Safari/537.36 Sec-Fetch-User: ?1 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9 Sec-Fetch-Site: none Sec-Fetch-Mode: navigate Accept-Encoding: gzip, deflate, br Accept-Language: zh-CN,zh;q=0.9 ' """ while True: conn, addr = server.accept() data = conn.recv(1024) # print(data) conn.send(b'HTTP/1.1 200 OK ') data = data.decode('utf-8') # 将字节变成字符串 # 获取用户网址后的输入 target_url = data.split(' ')[0].split(' ')[1] # print(target_url) if target_url == '/index': conn.send(b'index') elif target_url == '/login': with open(r'D:Python13期day36 emplatesdemo.html', 'rb')as f: conn.send(f.read()) else: conn.send(b'404 error') conn.close()
基于wsgiref模块设计
文件拆分:
urls.py: 路由与视图函数的对应关系
views.py: 里面就是放的一堆视图函数(视图函数可以是函数也可以是类)
templates文件夹: 里面放的就是一堆html文件(模板文件夹)
基于wsgiref模块以及文件拆分特点:
1.先在urls文件中写url与函数的对应关系
2.再去views文件中写对应的函数
示例:
from wsgiref.simple_server import make_server from day36.urls import urls from day36.views import * def run(env, response): """ :param env: 请求相关的所有数据 :param response: 响应相关的所有数据 :return: 浏览器能够接收的内容 """ response('200 OK', []) # env: 大字典里面的PATH_INFO参数就是用户输入的后缀 target_url = env.get('PATH_INFO') func = None for url in urls: if target_url == url[0]: func = url[1] break if func: res = func(env) else: res = error_404(env) return [res.encode('utf-8')] if __name__ == '__main__': server = make_server( '127.0.0.1', 8080, run ) # 启动服务端 server.serve_forever()
from day36.views import * # 路由视图函数对应关系 urls = [ ('/index', index), ('/login', login), ('/get_time', get_time), ('/get_dic', get_dic), ('/get_db', get_db) ]
import time from jinja2 import Template import pymysql def index(env): return 'index' def login(env): return 'login' def error_404(env): return '404 error' def get_time(env): current_time = time.strftime('%Y-%m-%d %X') with open(r'D:Python13期day36 emplatesget_time.html', 'r')as f: data = f.read() data = data.replace('time', current_time) return data def get_dic(env): user_dic = { 'username': 'tank', 'pwd': 123, 'hobby': ['read', 'run', 'talk'] } with open(r'D:Python13期day36 emplatesget_dic.html', 'r')as f: data = f.read() temp = Template(data) res = temp.render(dic1=user_dic) return res def get_db(env): conn = pymysql.connect( host='127.0.0.1', port=3306, user='root', password='123', database='test1', charset='utf8', autocommit=True ) cursor = conn.cursor(cursor=pymysql.cursors.DictCursor) sql = 'select * from teacher' cursor.execute(sql) data = cursor.fetchall() with open(r'D:Python13期day36 emplatesget_db.html', 'r', encoding='utf-8')as f: res = f.read() tmp = Template(res) res = tmp.render(db=data) return res
3.创建一个templates文件夹,里面用来存放HTML文件
jinja2模块
提供了一个可以在html页面上书写类似于python后端的代码 来操作数据(模板语法)
{{ xxx }} <p>{{xxx.username}}</p> <p>{{xxx['password']}}</p> <p>{{xxx.get('hobby')}}</p> <p>{{xxx.get('hobby')[0]}}</p> <p>{{xxx.get('hobby').1}}</p>
后端大致框架
1.路由与视图函数对应关系
2.视图函数
3.模板文件夹
4.模板语法(是在后端实现的 前端根本不识别)
django框架
1.注意事项
- 计算机名称不能有中文
- 项目文件名也不要用中文
- 一个pycharm窗口就是一个单独的完整的项目
2.创建django项目
命令行:
创建django项目:django-admin startproject mysite(项目名)
启动django项目(先切换到项目目录下):python3 manage.py runserver # django默认的端口号是8000
创建具有独立功能的app:python manage.py startapp app01
pycharm快捷创建
两者创建区别:
1.使用命令行创建的django项目是不会自动创建templates摸版本文件夹 你只能自己手动创建
2.命令行创建的django项目不但没有templates文件夹配置文件中也没有填写路径,而pycharm创建的会自动添加
3.app概念
app就是应用意思
django其实是一个专注于开发app的web框架,一个空的django项目就类似于是一所大学,app就类似于大学里面的各个学院,每个app其实就类似于不同的功能模块
例如一个购物网站:
用户相关 user
用户相关的app
订单相关 order
订单相关的app
投诉相关 tousu
投诉相关的app
不同的功能模块推荐使用不同的app去开发
django支持多app
4.django主要文件功能
mysite -mysite --__init__.py --settings.py 项目配置文件 --urls.py 路由视图函数对应关系 项目的总路由 --wsgi.py -manage.py app01 --migrations文件夹 数据库改动记录 ----__init__.py --__init__.py --admin.py django后台管理 --apps.py 注册app相关 --models.py 模型类(ORM) --tests.py 测试文件 --views.py 视图函数(******) app02 --migrations文件夹 数据库改动记录 ----__init__.py --__init__.py --admin.py django后台管理 --apps.py 注册app相关 --models.py 模型类(ORM) --tests.py 测试文件 --views.py 视图函数(******) db.sqlite3 django自带的一个小型用于本地测试的数据库(对日期格式的数据不是很敏感)
5.django三板斧
HttpResponse:返回字符串
render:返回html页面 并且可以给html页面传数据
redirect:重定向
def index(request): return HttpResponse('你好啊') def login(request): return render( request, 'login.html', {'user_dic': {'username': 'jason', 'password': '123'}} ) def home(request): return redirect('http://www.baidu.com')