系列文章目录
提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加
例如:第一章 Python 机器学习入门之pandas的使用
提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档
文章目录
https://blog.csdn.net/raoxurou/article/details/121479576
手写web框架
纯手写web框架问题。
-
代码过于冗余
-
处理http数据过去繁杂
import socket
server = socket()
server.bind(('127.0.0.1',8080))
server.listen(5)
while True:
conn,addr = server.accept()
data = data.decode('utf8')
print(data)
target_url = data.split(' ')[1]
conn.send(b'HTTP/1.1 200 OK\r\n\r\n')
if target_url == '/index':
conn.send(b'from index')
elif target_url == '/login':
conn.send(b'from login')
elif target_url == '/func':
with open(r'myhtml.html','rb') as f:
for line in f:
conn.send(line)
else:
conn.send(b'404 error')
wsgiref模块
from wsgiref.simple_server import make_server
def run(request,response):
"""
:param request:跟请求相关的数据
:param response: 跟响应相关的数据
:return: 返回值就是要给前端浏览器的数据
"""
response('200 ok',[])
#print(request) #自动处理所有http协议相关的数据并组织成一个大字典
target_url = reauest.get('PATH_INFO')
if target_url == '/index':
return [b'from index']
elif target_url == '/login':
return [b'from login']
return [b'hello world']
if __name__ == '__main__':
# 监听127.0.0.1:8080 一旦有请求 立刻将第三个参数加括号调用
server = make_server('127.0.0.1', 8080, run)
# 启动服务端
server.serve_forever()
变化优化
针对后缀较多的情况,优化匹配·
def register():
return 'register页面'
urls = [
('/index',index),
('/login',login),
('/reg',register)
]
针对同一个py文件内部代码功能繁杂的情况 拆分多个py文件
views.py 专门用于存放核心业务逻辑
urls.py 专门用于存放路径对应关系
templates 专门用于存放html文件
'''以后新增功能只需要views.py写函数 然后urls.py写对应关系即可'''
动静态网页
-
动态网页
数据不是写死在html页面上,而是动态获取 -
静态网页
数据直接写死在页面上的
jinja2模块
-
该模块提供了模版语法
-
支持后端给html页面传递数据并且支持后端语法
pip install jinja2 {% for user_list in data_list %} {{user_dict}} {{user_dict['username']}} {{user_dict.get('pwd')}} {{user_dict.hobby}} {% for key in user_dict%} {{ key }} {% endfor %}
将数据库表数据利用模版语法展示到前端页面
python主流web框架
django
大而全,内部自带的组件特别多。有时过于笨重
flask
小而精,内部几乎没有什么自带的组件,全部依赖于第三方模块。有时也会出现第三方模块无法兼容的情况
tornado
异步非阻塞
知识科普
-
同步异步
- 同步:提交任务之后原地等待任务的返回结果 期间不做任何事
- 异步:提交任务之后不原地等,有结果通过回调机制反馈
-
阻塞非阻塞
- 阻塞:程序被剥夺了CPU执行权限
- 非阻塞:运行态,就绪态
django框架
-
主要事项
- 计算机名称里面不要有中文
- 项目名和py文件名尽量不使用中文
下载命令
pip3 install django==1.11.1
验证下载完成
django-admin
django基本使用
命令行创建django项目
#创建django项目
django-admin startproject 项目名
#运行Django项目
cd 项目名
python3 manage.py runserver
#创建app
python3 manage.py startapp app名字
"""
命令行创建不会自动创建templates文件夹,并且配置文件中也不会配置
需要自己创建文件夹并配置
"""
django主要目录结构
-
同名文件夹
settings.py
- django暴露给用户可以自定义的配置文件
urls
- 存放路由(路径)与函数(视图函数)对应关系
wsgi.py
- 依赖于wsgiref模块的socker启动部分
manage,py
- django的入口(启动文件)
app01文件夹
mi grations文件夹
- 里面存放ORM针对数据库相关的记录
admin.py
- 每个应用的独立标示
models.py
- 与数据库打交道的文件(ORM)
test.py
- 自带的测试文件
db.sqlite3
- django自带的小型数据库
1.创建app之后一定要去settings.py中注册
INSTALLED_APPS = [
# 全写
'app01.apps.App01Config',
# 简写
'app02'
]
2.templates路径配置
TEMPLATES = [
{
'DIRS': [os.path.join(BASE_DIR, 'templates')]
}
Django小白必会三板斧
HttpResponse
返回给前端浏览器文本类的数据
render
render (request,'index.html',{'n1':[1,2,3]}) #精准传
render (request,'index.html',locals) #范围传
#返回给前端页面,并提供模版语法
redirect
重定向
redirect('https://www.baidu.com') # 可以写全称
redirect('/admin/') # 也可以只写后缀(默认补齐当前IP和PORT)
urls.py 存放路由与视图函数对应关系 路由层
views.py 存放视图函数(核心业务逻辑) 视图层
templates文件夹 存放html文件 模板层
models.py 存放与数据库相关的代码(ORM) 模型层
"""
1.django默认的端口号是8000
在同一台机器同一时间如果需要运行多个django项目 需要修改端口号
python3 manage.py runserver ip:port
pycharm自主修改
2.浏览器缓存
settings
networks
disable cache
"""
静态文件配置
# 利用django编写用户登录功能
'''为什么前端请求不到后端的框架资源:我们没有开设对应的资源接口'''
针对静态资源的路径开设无需在urls.py中指定 只需要在配置文件指定即可
STATIC_URL = '/static/'
STATICFILES_DIRS = [
os.path.join(BASE_DIR,'static')
]
/static/bootstrap-3.4.1-dist/js/bootstrap.min.js
# 什么是静态文件
不会频繁更改的文件
css文件、js文件、第三方框架文件、图片
# django存储静态文件
static文件夹
该文件内部还可以依据不同的功能划分不同的区域
css文件夹
js文件夹
img文件夹
others文件夹
# 进阶关系
STATIC_URL = '/static/' # 接口前缀(要想访问静态资源 那么路径的前缀就必须是这里指定的)
# 将static文件夹所有的资源开设给外界
STATICFILES_DIRS = [
os.path.join(BASE_DIR,'static'), # 文件夹名称
os.path.join(BASE_DIR,'static1'), # 文件夹名称
os.path.join(BASE_DIR,'static2') # 文件夹名称
]
"""
接口前缀正确之后 拿着后面的路径去列表中
从上往下依查找对应的资源 找到了就不再继续往下找
"""
# 接口前缀动态匹配
{% load static %}
<link rel="stylesheet" href="{% static 'bootstrap-3.4.1-dist/css/bootstrap.min.css' %}">
<script src="{% static 'bootstrap-3.4.1-dist/js/bootstrap.min.js' %}"></script>
网络请求方式
1.get请求
朝别人索要数据
eg:浏览器地址栏输入www.baidu.com回车
get请求没有请求体
get请求也可以携带一些的额外的参数 但是大小有限制(2KB)
url?xxx=yyy&aaa=bbb
2.post请求
朝别人提交数据
eg:用户注册登录填写完身份数据之后提交
post请求有请求体
post请求也可以携带数据 并且大小没有限制 在请求体中
form表单重要参数
action # 控制数据提交的地址
1.写全路径 https://www.baidu.com
2.写后缀(ip和端口自动补全当前服务器) /index/
3.不写 提交给当前页面所在的地址
method # 控制数据提交的方式
get form表单默认是get请求
post
"""
注意使用django前期在提交post请求之前需要去配置文件中注释掉一行代码
MIDDLEWARE = [
# 'django.middleware.csrf.CsrfViewMiddleware',
]
"""
requests对象方法
request.method # 获取请求方式名(纯大写的字符串)
request.POST # 获取post请求提交的普通数据
request.POST.get()
request.POST.getlist()
request.GET # 获取get请求url问号后面的数据
request.GET.get()
request.GET.getlist()
def login(request):
if request.method == 'POST':
username = request.POST.get('username') # 默认只会取列表最后一个元素
password = request.POST.get('password')
if username == 'jason' and password == '123':
return HttpResponse('OK')
else:
return HttpResponse('用户名或密码错误')
return render(request, 'login.html')
pycharm链接MySQL
database选项
django链接MySQL(必会)
# 第一步配置
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'user',
'USER':'root',
'PORT':3306,
'HOST':'127.0.0.1',
'PASSWORD':'Password123',
'CHARSET':'utf8'
}
}
# 第二步配置(3.6及以下解释器 需要额外的配置)
import pymysql
pymysql.install_as_MySQLdb()
'''只要是__init__文件即可 项目的 应用的都可以'''