python-------------------------web框架
前端与数据库交互的桥梁
软件开发架构
cs架构
bs架构
#本质也是cs
1、day_01
#HTTP
网络协议 数据传输明文
HTTPS
网络协议 加密传输
websocket 数据加密传输
四点特向:
1、基于请求响应
2、基于tcp,ip作用应用层
3、无状态
4、短/无连接
数据格式:
响应状态码
#如何做到后缀不同得到不同的返回内容:
1、拿到用户的后缀 做判断:
# web服务端
import socket
server = socket.socket() # tcp 三次握手,四次挥手
server.bind(('127.0.0.1', 8081))
server.listen(5) # 监听池
while True:
conn, add = server.accept()
data = conn.recv(1024)
print(data)
conn.send(b"HTTP/1.1 200 OK\r\n\rhellow web")
conn.close()
#b'GET / HTTP/1.1\r\n
Host: 127.0.0.1:8081\r\
nConnection: keep-alive\r\
nCache-Control: max-age=0\r\
nsec-ch-ua: " Not;A Brand";v="99", "Microsoft Edge";v="91", "Chromium";v="91"\r\n
sec-ch-ua-mobile: ?0\r\n
Upgrade-Insecure-Requests: 1\r\nUser-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.77 Safari/537.36 Edg/91.0.864.41\r\n
Accept:
#
b'GET /index HTTP/1.1\r\n
Host: 127.0.0.1:8081\r\nConnection: keep-alive\r\nsec-ch-ua: " Not;A Brand";v="99", "Microsoft Edge";v="91", "Chromium";v="91"\r\n
# web服务端
import socket
server = socket.socket() # tcp 三次握手,四次挥手
server.bind(('127.0.0.1', 8081))
server.listen(5) # 监听池
while True:
conn, add = server.accept()
data = conn.recv(1024)
data.decode("utf-8")
conn.send(b"http/1.1 200 OK\r\n\r yyy ")
with open(r'My_g.html', 'rb') as f:
conn.send(f.read())
# 获取字符串的特定内容
current_path = data.split()
print(current_path)
if current_path == "/index":
conn.send(b"hehehehe")
elif current_path == "/login":
conn.send(b"heheheheyyyy")
conn.send(b"hellow webiiiii")
conn.close()
以上不足之处:
1、代码重复
2、手动处理http格式(数据格式一样,所以处理也大致一样)
3、并发为解决
1、借助wsgiref模块:
ursl.py 路由与视图函数对应关系
views.py 视图函数
templates文件夹 存储HTML文件
#按照功能拆分之后 ,后续添加即可
from wsgiref.simple_server import make_server
from urls import *
def run(env, response):
'''
:param env: 请求的所有数据
:param response: 响应2的所有数据
:return: 返回给浏览器的数据
'''
print(env) # 大字典,已经处理好了http 'GET', 'PATH_INFO': '/','GET', 'PATH_INFO': '/favicon.ico'
response('200 OK', [])
current_path = env.get("PATH_INFO")
# if current_path == "/index":
# return [b'index']
# elif current_path == "/login":
# return [b'login']
# else:
# return [b'404']
# 提前第一存储匹配的到函数
func = None
for url in urls:
if current_path == url[0]:
func = url[1]
break # 结束
if func is None:
res = "404"
else:
res = func(env)
return [res.encode("utf-8")]
if __name__ == "__main__":
server = make_server("127.0.0.1", 8080, run) # 实时接听改地址,只要有客户端来了,交给run函数运行,如果是对象也一样
server.serve_forever()
views:
import datetime
def index(env):
return 'index'
def login(env):
return 'login'
def fun_xxx(env):
with open(r'temples_html/My_g.html', 'r', encoding="utf-8") as f:
res = f.read()
return res
def get_time(env):
curent_time = datetime.datetime.now().strftime('%Y-%m-%d %X')
with open(r'temples_html/get_time_1.html', 'r', encoding='utf-8') as f:
data = f.read()
# data 字符串
data = data.replace('sssssss', curent_time) # 先处理好之后再发给前端
return data
urls:
from views import *
# url 与函数对应关系
urls = [
('/index', index),
('/login', login),
('/xxx',fun_xxx),
('/time',get_time)
]
2、动静态网页:
"""
静态网页:内容写死
动态网页:数据实时获取
eg:
1、时间展示
2、数据库获取数据
"""
3、模板语法jinja2模块
简介
Jinja2是Python下一个被广泛应用的模版引擎,他的设计思想来源于Django的模板引擎,并扩展了其语法和一系列强大的功能。其中最显著的一个是增加了沙箱执行功能和可选的自动转义功能,这对大多应用的安全性来说是非常重要的。
他基于unicode并能在python2.4之后的版本运行,包括python3。 [1]
特性
沙箱执行模式,模板的每个部分都在引擎的监督之下执行,模板将会被明确地标记在白名单或黑名单内,这样对于那些不信任的模板也可以执行。
强大的自动HTML转义系统,可以有效地阻止跨站脚本攻击。
模板继承机制,此机制可以使得所有的模板都具有相似一致的布局,也方便了开发人员对模板的修改和管理。
高效的执行效率,Jinja2引擎在模板第一次加载时就把源码转换成Python字节码,加快模板执行时间。
可选的预编译模式。
调试系统融合了标准的Python的TrackBack系统,使得模板编译和运行期间的错误能及时被发现和调试。
语法可配置,可以重新配置Jinja2使得它更好地适应LaTeX或JavaScript的输出。
模板设计人员帮助手册,此手册指导设计人员更好地使用Jinja2引擎的各种方法。 [1]
def get_dict(env):
user_dir = {'username':'jason','age':18}
with open(r'temples_html/get_dict.html','r',encoding="utf-8") as f:
data = f.read()
tmp = Template(data)
res = tmp.render(user=user_dir) # 给get_dict.html传递一个值,页面上通过user就能拿到user_dict
return res
#后端获取数据库展示到前端页面
<table class="table table-hover table-striped">
<thead>
<tr>
<th>ID</th>
<th>username</th>
<th>password</th>
<th>hobby</th>
</tr>
</thead>
<tbody>
{% 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%}
</tbody>
def get_user(env):
pass
#取数据:
conn = pymysql.connect(
host='180.76.161.20',
port = 3306,
user = 'root',
password = "123456",
db='My_Try_Value',
charset="utf8",
autocommit=True
)
cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)
sql = "select * from useinfor"
affect_row = cursor.execute(sql)
data_list = cursor.fetchall() #[{},{}]
with open(r'temples_html/get_data.html','r',encoding="utf-8") as f:
data = f.read()
tem = Template(data)
res = tem.render(user_list = data_list)
return res
#模块语法(贴近py语法)
{{ user }}
{{user.get('username')}}
{{user.age }}
{{user['happy']}}
4、简易web框架流程:
"""
wsgiref模块
1、请求时来的http数据,封装大字典
2、响应走的时候的数据打包成符合http格式
"""
5、python三大主流web框架
"""
django
特点:大而全,功能强大
不足:
有时候过于笨重(小型项目用不到)
flash
特点:小而经 自带功能特别的小 类似与游骑兵
第三方的模块多(辅助,如果flash第三方模块加起来完全可以盖过djongo,而且很像)
不足:
比较依赖与第三方的开发者
tornado
特点:异步非阻塞,支持高并发
牛逼:可以开发游戏服务器
不足:
暂时:不会
"""
三部分:
A:socket
B:路由与视图对应关系
c:模板语法
django:
A,wsgiref
B,自己
c,自己的,没有jinja2好用
flash
A,别人werzeug
B,自己
c,jinja2
torndo
a、b、c都自己的
6、注意事项
# 如何让计算机正常启动
1、计算机的名称不能有中文
2、一个pycham只能开一个项目
3、项目名所有文件尽量不要出现中文
4、python解释器用3.4-3.6
如果项目报错,点击之后一个报错信息,把源码中的逗号删掉
#django版本问题:
1.x 2.x 3.x(忽略)
1.2巨多,差距也不大,主要以1.x为例
#django按照
pip3 install djang==1.11.11
如果已经安装了其他版本,无需卸载
会直接重新装,自动卸载安装新的
验证安装成功:1、
终端输入django-admin
7、django基本操作:
#命令行操作()
#1、创建django项目:
先切换到对应盘
D:
1\django-admin startproject 项目名
结构层次
manage.py
mysite文件夹
settings.py
__init__.py
ursl.py
wsgi.py
2\启动
"""
cd /mysite
"""
python3 manage.py runserver
CTRL+c停止运行
3\创建应用:
Next, start your first app by running python manage.py startapp [app_label].
python manage.py startapp app01
应用名,简明之一
user
order
#pycham操作
启动出错
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [BASE_DIR ,'templates'] \变,
,
'APP_DIRS': True,
创建应用
1、pycham终端命令
2、run manage.py T
3、手动注册app
/***********************************************重要****************************************************/
setings.py下
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'app02.apps.App01Config'
# 简写: ‘app02’
]
ps,pycham创建时可以帮你创建仅一个app并注册好
/ *******************************************************/
4、添加路劲(命令行,终端)
[os.path.join(BASE_DIR,'templates')]
启动成功结果:
(day_001) F:\web_project\mysite>python manage.py runserver
Performing system checks...
System check identified no issues (0 silenced).
You have 13 unapplied migration(s). Your project may not work properly until you apply the migrations for app(s): a
dmin, auth, contenttypes, sessions.
Run 'python manage.py migrate' to apply them.
June 13, 2021 - 16:25:40
Django version 1.11.2, using settings 'mysite.settings'
Starting development server at http://127.0.0.1:8000/
Quit the server with CTRL-BREAK.
[13/Jun/2021 16:25:58] "GET / HTTP/1.1" 200 1716
Not Found: /favicon.ico
[13/Jun/2021 16:25:58] "GET /favicon.ico HTTP/1.1" 404 1962
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传
命令行与pycham创建区别
命令行创建
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [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',
],
},
},
]
7、应用:
django专门开发app的框架
django类似与一所大学
app类似与各个学院:
比如:
一个app就是一个独立的app
8、主要文件简介
-mysite项目文件
--mysite文件夹
---settings.py 配置文件
---urls.py 路由与视图
---wsgi.py wsgiref模块
--manage.py django人口文件
--db.sqlites djang0自带的数据库(小型,功能不是很多,有bug)
--appo1
---admin.py django后台管理
---apps.py 注册使用
---migrations文件夹 数据库迁移记录
---models.py 数据库相关的 模型类(orm)
---tests.py 测试文件
---views.py 视图文件
9、django小白必会3板斧
usrl中
from django.contrib import admin
from app02 import views
urlpatterns = [
url(r'^admin/', admin.site.urls),
#写我们自己的;
url(r'^index/', views.index),
]
"""
views中
HttpResponse
返回字符串
from django.shortcuts import render ,HttpResponse,redirect
# Create your views here.
def index(request):
"""
:param request: 请求数据,比env对象
:return:
"""
return HttpResponse('HTML^^^^^^')
render
return render(request,'MY_Fist.html') #配置文件作用下查找,返回HTML文件
redirect
重定向
return redirect("http://www.mzitu.com/") # 网页跳转 //本django网页,自己的网页时可以直接写后缀名
"""
(r’^admin/’, admin.site.urls),
#写我们自己的;
url(r’^index/’, views.index),
]
“”"
views中
HttpResponse
返回字符串
from django.shortcuts import render ,HttpResponse,redirect
```python
# Create your views here.
def index(request):
"""
:param request: 请求数据,比env对象
:return:
"""
return HttpResponse('HTML^^^^^^')
render
return render(request,'MY_Fist.html') #配置文件作用下查找,返回HTML文件
redirect
重定向
return redirect("http://www.mzitu.com/") # 网页跳转 //本django网页,自己的网页时可以直接写后缀名
"""