什么是web框架?
框架,即framework,特指为解决一个开放性问题而设计的具有一定约束性的支撑结构,使用框架可以帮你快速开发特定的系统,简单地说,就是你用别人搭建好的舞台来做表演。
我们可以这样理解:所有的Web应用本质上就是一个socket服务端,而用户的浏览器就是一个socket客户端。 这样我们就可以自己实现Web框架了。
简易版本自定义web框架
import socket
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.bind(('127.0.0.1', 8000))
sock.listen()
while True:
conn, addr = sock.accept()
data = conn.recv(8096)
# 给回复的消息加上响应状态行
conn.send(b"HTTP/1.1 200 OK\r\n\r\n")
conn.send(b"OK")
conn.close()
复制代码
最简单的Web应用就是先把HTML用文件保存好,用一个现成的HTTP服务器软件,接收用户请求,从文件中读取HTML,返回。
服务器程序和应用程序
对于真实开发中的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开发环境用的就是这个模块来做服务器。
服务器程序,正常开发环境下用wsgiref,而在正式假设服务上线用uWSGI。
wsgiref
利用wsgiref模块来替换我们自己写的web框架的socket server部分
from wsgiref.simple_server import make_server
from urls import urls
from views import *
def run(env,response):
print(env) # 是个字典类型
# 固定写法
response('200 OK',[]) # 列表里面放的是请求首行的信息,可以不放,但是必须写
# 获取当前用户访问路径
current_path = env.get('PATH_INFO')
# 定义一个函数标志位
func = None
for url_list in urls: # urls:[[],[],[]] url_list:['',func]
if current_path == url_list[0]:
func = url_list[1]
# 结束for循环了
break
if func:
res = func(env)
else:
# 匹配不上 走error
res = error(env)
return [res.encode('utf-8')]
if __name__ == '__main__':
server = make_server('127.0.0.1',8888,run)
server.serve_forever()
复制代码
jinja2
为了能实现从数据库中查询数据,然后替换html中的对应内容再发送给浏览器完成渲染, 这个过程就相当于HTML模板渲染数据,本质上就是HTML内容中利用一些特殊的符号来替换要展示的数据。 因此可以使用jinja2(模版渲染工具)
模板的原理就是字符串替换,我们只要在HTML页面中遵循jinja2的语法规则写上,其内部就会按照指定的语法进行相应的替换,从而达到动态的返回内容。
Django
应用APP
app即一个个分支,项目好比是一个学校,应用app就好比一个个学院,所以一个项目下可以有多个app应用
目录介绍:
应用名下的
migrations 数据库迁移记录相关
models.py 数据库模型表(ORM)
views.py 视图函数(执行相关功能的)
项目名下
__init__.py
settings.py 项目配置文件
urls.py 路由与视图函数的对应关系
wsgi.py wsgiref相关
manage.py 项目入口文件
templates 存放html文件
复制代码
创建方式
命令行创建django项目
django-admin startproject mysite
命令行创建app
python manage.py startapp 应用名
命令行启动django
python manage.py runserver
注意:用命令行创建的时候,默认没有templates文件夹,需要你自己手动创建并且在settings配置文件中写上路径
在Django中约定俗成的几个方面
- html文件夹约定俗成的放在templates文件夹下
#在setting文件中需要有以下配置,若没有则需要进行配置
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [os.path.join(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',
],
},
},
]
复制代码
- 静态文件都在放在static文件夹下,一般情况下static文件夹下建议分成css,js及其他相关文件夹实现分层
#在setting文件中需要进行配置
#django静态文件配置
STATIC_URL = '/static/'
# 静态文件路径配置
STATICFILES_DIRS = [
os.path.join(BASE_DIR,'static'),
os.path.join(BASE_DIR,'static1'),
os.path.join(BASE_DIR,'static2'),
]
复制代码
Django基础必备三件套
from django.shortcuts import HttpResponse, render, redirect
HttpResponse
内部传入一个字符串参数,返回给浏览器。
render
除request参数外还接受一个待渲染的模板文件和一个保存具体数据的字典参数。
将数据填充进模板文件,最后把结果返回给浏览器。(类似于上面用到的jinja2)
redirect
重定向:接受一个URL参数,表示跳转到指定的URL。
redirect与render的区别在于:redirect走的是路径,而render返回的是模板
启动Django报错
- Django 启动时报错 UnicodeEncodeError ...
报这个错误通常是因为计算机名为中文,改成英文的计算机名重启下电脑就可以了。
- Django 启动时报错 SyntaxError: Generator expression must be parenthesized...
报这个错误通常是由于解释器与Django之间的兼容问题,建议使用3.6版本的解释器,就不会有该问题了。