软件开发架构
client-----server架构
browser-----server架构
web服务的本质
1.浏览器的信息流程
1.) 向浏览器发数据请求
2.) 服务端接受请求
3.) 服务端发送数据
4.) 浏览器渲染
2.http协议
http协议 明文协议
https协议 密文协议
weksocket协议 数据传输为密文
3.http协议的四大特性
1.) 基于请求响应
2.) 应用于socket之上的应用层协议
3.) 无状态
4.) 短/无链接
4.响应状态码
1xx 服务端正在接受
2xx 成功 200
3xx 重定向
4xx 报错 403 403
5xx 服务端内部出错
5.请求数据格式
请求首行(协议版本 请求方式)
请求头
\r\n
请求体
6.响应数据格式
响应首行(协议版本 状态码)
响应头
\r\n
响应体
简易的web
import socket
server = socket.socket()
server.bind(('127.0.0.1',8080))
server.listen(5)
while True:
conn,addr = server.accept()
conn.recv(1024)
conn.send(b'HTTP/1.1 200 OK\r\n\r\n')
conn.send(b'hello world!')
基于wsgiref框架的web
'''
wsgiref做得事情:
1.接收response信息,并且切割为数组形式
2.封装响应信息返回
通过wsgiref可以简易将框架分为四个部分:
1.urls (路由层,指定路由对应的响应视图函数)
2.views (视图函数)
3.wsgiref (socket以及Http协议相关)
4.templates(html文件)
'''
1.wsrigef
from wsgiref.simple_server import make_server
from urls import urls
from views import common
def run(env, response):
response('200 OK', [])
"""
:param env:请求类的数据 字典形式
:param response: 响应类的数据
:return:
"""
current_passage = env.get('PATH_INFO')
for url in urls:
if current_passage == url[0]:
res = url[1]()
break
else:
res = common()
return [res.encode('utf-8')]
if __name__ == '__main__':
server = make_server('127.0.0.1', 8080, run)
server.serve_forever()
2.urls
from views import *
urls = [
('/index', index),
('/register', register),
('/library', library),
('/time', time),
('/database',connect_database)
]
3.views
def index():
return 'index'
def register():
return 'login'
def common():
return '4040 error'
def library():
with open('图书管理员系统.html', 'r', encoding='utf-8') as f:
return f.read()
def time():
import datetime
with open('站位.html', 'r', encoding='utf-8') as f:
res = f.read()
res = res.replace('stance', datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S'))
return res
def connect_database():
from jinja2 import Template
import pymysql
"""
user = {...}
jinja2对字典的操作:
{ user } ==> 拿到字典
{user.get('拿到字典的值')}
{user.属性}
{user['键名']}
for循环
{%for ... in ...%}
拿出属性进行操作
{%endfor}
"""
connect = pymysql.connect(
host='127.0.0.1',
port=3306,
user='root',
password='123456',
db='django',
charset='utf8',
autocommit=True,
)
cursor = connect.cursor(pymysql.cursors.DictCursor)
sql = 'select * from userinfo'
cursor.execute(sql)
data_list = cursor.fetchall()
with open('table.html','r',encoding='utf-8') as f:
data = f.read()
tmp = Template(data)
res = tmp.render(user_list=data_list)
return res
动静态网页
'''
动态网页是指:数据的来源是后端以及数据库
静态网页是指:数据的来源是前端写死不会变的
'''
前后端交互的两种方式
'''
1.字符串操作
html文件本质上就是一串字符串,因此操作的时候可以直接是使用字符串的一些方法来操作
如先用特定的字符串进行站位,然后再替换
def time():
import datetime
with open('站位.html', 'r', encoding='utf-8') as f:
res = f.read()
res = res.replace('stance', datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S'))
return res # 有新的返回值,替换的数据需要用新的参数接受,而非对原参数的修改
2.模板语法
jinja2
'''
jinja2初识
'''
jinja2是一种模板语法,能够快捷的将后端数据传入前端,并且在前端操作
'''
1.字典操作
后端代码:
from jinja2 import Template
dict = {}
with open.....
tmp = Template(f.read)
res = tmp.rander(kwargs--->user=dict)
前端代码
{user.get()}
{user.['']}
{user.key}
1.jinja2操作字典
{user} --字典本身
{user.get()}
{user.['']}
{user.key}
2.jinja2的for循环
{%for .. in ..%}
{{对值得具体操作}}
{{对值得具体操作}}
{{对值得具体操作}}
{%endfor%}
如:
{% for user_dict in user_list %}
<tr>
<td>{{ user_dict.id}}</td>
<td>{{ user_dict.username}}</td>
<td>{{ user_dict.password}}</td>
<td>{{ user_dict.hobby}}</td>
</tr>
{% endfor%}
python三大主流框架初识
"""
1.django
优点:大而全
缺点:笨重
2.flask
优点:小而精,第三方库丰富
缺点:依赖第三方库
越来越像django
3.tornado
优点:天生异步非阻塞,能够支持高并发。
缺点:无
"""
Django首次启动注意事项
1.计算机名不能有中文
2.一个pycharm程序中只能有一个项目
3.项目中最好也不要出现中文
4.python解释器尽量3.4~3.6版本
如果出现错误将,删掉
1.x和2.x,3.x出现不兼容问题
首选1.x
python install django==1.11.11
重新安装时会自动删除以前的版本
Django的基本操作
django-admin startproject xxxx
python manage.py runserver
Python manage.py startapp xxx
file -->创建新项目
1.右上角直接运行django
2.在terminal直接输入完整的命名创建APP(tool run 3.manage.py task 开启补全)
4.edit config 编辑端口等一些参数
应用(app)介绍
'''
django是一款专门开发app的应用
django是整个系统,而app对应着不同的功能
如:
用户处理
销售处理
等
因此针对不同的功能要创建不同的app
'''
********************************************
app创建好一定要在settings中注册
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'app01.apps.App01Config',
]
********************************************
书写方式:
1.app名简称
2.app.apps.appConfig
djang主要文件
'''
-mysite项目文件夹
--mysite文件夹
---settings.py 配置文件
---urls.py 路由与视图函数对应关系(路由层)
---wsgi.py wsgiref模块(不考虑)
--manage.py django的入口文件
--db.sqlite3 django自带的sqlite3数据库(小型数据库 功能不是很多还有bug)
--app01文件夹
---admin.py django后台管理
---apps.py 注册使用
---migrations文件夹 数据库迁移记录
---models.py 数据库相关的 模型类(orm)
---tests.py 测试文件
---views.py 视图函数(视图层)
'''
命令行与pycharm创建的主要区别
'''
1.在python中创建会自动生成templates文件夹存放html文件
并且还会在settings中自动配置好templates的文件夹路径
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
# 'DIRS': [str.format(BASE_DIR, '/templates')],
'DIRS': [os.path.abspath(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',
],
},
},
]
2.在cmd中创建不会有,需要手动配置
'''
Django返回数据的三种方法
1.HttpResponse
返回字符串数据相关
2.render(response,'文件')
返回html文件
3.redict
跳转到其他的页面
如果是Django项目中的直接加后缀即可
如果是其他网页需要输入全称
from django.shortcuts import render,HttpResponse,redirect
def index(request):
"""
:param request:请求相关的数据,比wsgiref中的env更好用
:return:
"""
return HttpResponse('hello world')
def inner(request):
return render(request,'here.html')
def renders(request):
return redirect('inner/')
'''
render方法给前端页面传值的两种方法
1.在render(request,'xxx', {'values':需要传入的}) # 精确度高
2.如果变量很多可以直接render(request,'xxx', {'values':locals()#会直接传入函数体的其他变量名} # 省时间
'''