提交 32e20442 编写于 作者: 鞋子不会飞's avatar 鞋子不会飞

Merge branch 'dev' into 'master'

Dev

See merge request !1
#配置语法:
#以斜杠“/”开头表示目录;
#以星号“*”通配多个字符;
#以问号“?”通配单个字符
#以方括号“[]”包含单个字符的匹配列表;
#以叹号“!”表示不忽略(跟踪)匹配到的文件或目录;
#常用的规则:
/.idea 过滤整个文件夹
/test/ 过滤整个文件夹
*.zip 过滤所有.zip文件
/test/do.c 过滤某个具体文件
*.xml
*.iml
#被过滤掉的文件就不会出现在git仓库中(gitlab或github)了,当然本地库中还有,只是push的时候不会上传。
#需要注意的是,gitignore还可以指定要将哪些文件添加到版本管理中:
!*.zip
!/test/one.txt
#唯一的区别就是规则开头多了一个感叹号,Git会将满足这类规则的文件添加到版本管理中。
#为什么要有两种规则呢?想象一个场景:假如我们只需要管理/mtk/目录中的one.txt文件,这个目录中的其他文件都不需要管理,那么我们就需要使用:
#1)/mtk/
#2)!/mtk/one.txt
#假设我们只有过滤规则,而没有添加规则,那么我们就需要把/mtk/目录下除了one.txt以外的所有文件都写出来!
#
#最后需要强调的一点是,如果你不慎在创建.gitignore文件之前就push了项目,那么即使你在.gitignore文件中写入新的过滤规则,这些规则也不会起作用,Git仍然会对所有文件进行版本管理。
#简单来说,出现这种问题的原因就是Git已经开始管理这些文件了,所以你无法再通过过滤规则过滤它们。因此一定要养成在项目开始就创建.gitignore文件的习惯,否则一旦push,处理起来会非常麻烦。
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="VcsDirectoryMappings">
<mapping directory="$PROJECT_DIR$" vcs="Git" />
</component>
</project>
\ No newline at end of file
# wyh_web_tools
自定义网络工具
\ No newline at end of file
自定义网络工具
## 环境搭建
```shell
mkvirtualenv -p python3 wyh
# 进入虚拟环境
workon wyh
#安装包
pip install -i https://pypi.doubanio.com/simple/ -r requirements.txt
pip install -i https://pypi.doubanio.com/simple/ flask==1.1.2
```
2. 创建数据库
create database wyh_ind default charset=utf8; # 创建数据库
create user wyh identified by 'wyh123456'; # 创建用户&密码
grant all on wyh_ind.* to 'wyh'@'%'; # 给用户wyh开启数据库python的所有操作权限
flush privileges; # 刷新权限```angularjs
from flask import Blueprint
# 1.创建蓝图对象
# 细节1: 可以使用url_prefix对蓝图注册的所有路由添加统一的资源段前缀
admin_blu = Blueprint("admin", __name__, static_folder='static', static_url_path='/static',
template_folder='templates', url_prefix='/admin')
# 细节3: 蓝图设置请求钩子 只会监听该蓝图注册的路由
@admin_blu.before_request
def news_prepare():
print("news_prepare")
# 只要出现ImportError: cannot import name xx, 一定是导入的内容没有被定义
# 解决办法: 查看并修改代码的执行顺序
# 4.让程序关联视图文件
from . import views # 从当前包中导入views文件
from flask import url_for
from admin import admin_blu
# 2.使用蓝图对象来注册路由
@admin_blu.route('/')
def index():
# 细节2: 蓝图注册的路由, 其视图函数的标记为: 蓝图名.函数名
url1 = url_for('admin.index')
return "admin个人中心-首页"
@admin_blu.route('/basic_info')
def basic_info():
return "admin个人中心-基本信息"
from werkzeug.routing import BaseConverter
class MobileConverter(BaseConverter):
"""
手机号格式
"""
regex = r'1[3-9]\d{9}'
# 导入Flask类
import json
import sys
from flask import Flask, render_template, make_response, Response, jsonify, redirect, url_for
from flask import request
from common.converter.converter import MobileConverter
from user import user_blu
from admin import admin_blu
class DefaultConfig(object):
"""默认配置"""
SECRET_KEY = 'TPmi4aLWRbyVq8zu9v82dWYW1'
# Flask类接收一个参数__name__
print(sys.path) # 模块查询路径默认包含 解释器目录, 第三方包安装目录, 项目目录
app = Flask(__name__, # 导入名称, 用于查询静态文件/模板文件的存储路径
# 官方建议使用__name__, 如果使用该值, 则会从当前文件所在的目录中查询静态文件/模板文件夹
static_folder="static", # 设置静态文件存储路径
static_url_path="/static_url", # 设置静态文件的访问路径 如 /res/img/123.jpg
template_folder="templates" # 设置模板文件的存储路径
)
# 应用的配置方式
# app.config.from_object(DefaultConfig)
app.config.from_pyfile('settings.py')
# 3.注册蓝图对象
app.register_blueprint(user_blu)
app.register_blueprint(admin_blu)
# 自定义转换器注册
# 将自定义转换器添加到转换器字典中,并指定转换器使用时名字为: mobile
app.url_map.converters['mobile'] = MobileConverter
######################################################################应用顶层视图######################################################################
# 装饰器的作用是将路由映射到视图函数index
@app.route('/', methods=['GET', 'POST'])
def index():
# 获取基本的请求数据
print(request.url) # 本次请求的URL地址
print(request.method) # 本次请求的请求方式
print(request.headers) # 本次请求的请求头信息 类字典对象
print(request.headers.get('Host')) # 取某个请求头字段数据
# 传递的数据
# GET 查询字符串
# POST 请求体 1>键值对 如post表单 2>文件 如图片/音频 3> 文本 如json/xml
# 获取查询字符串 ?name=zs&age=10
print(request.args.get("name"))
print(request.args.get("age"))
# 获取post键值对数据
# print(request.form.get('username'))
# 获取post文件
file_obj = request.files.get('avatar') # type: FileStorage
file_obj.save("img01.jpg") # 将上传的文件保存到本地
data_bytes = file_obj.read() # 读取出上传的文件数据 bytes
print(data_bytes)
# 获取文本数据
# data_bytes = request.data # 返回bytes类型
# data_str = data_bytes.decode('utf-8')
# print(data_str)
# 获取json格式数据, 自动转为字典
# print(request.json.get('name'))
return "index"
@app.route('/url_map')
def route_map():
"""
主视图,返回所有视图网址
"""
rules_iterator = app.url_map.iter_rules()
return json.dumps({rule.endpoint: rule.rule for rule in rules_iterator})
# 利用methods参数可以自己指定一个接口的请求方式
@app.route("/wyh_test01", methods=["POST"])
def view_func_1():
return "hello world 1"
@app.route("/wyh_test02", methods=["GET", "POST"])
def view_func_2():
return "hello world 2"
@app.route('/<user_id>')
def user_info(user_id):
print(type(user_id))
return 'hello user {}'.format(user_id)
@app.route('/users/test01/<int:user_id>')
def user_info01(user_id):
print(type(user_id))
return 'hello user {}'.format(user_id)
@app.route('/users/test02/<int(min=1):user_id>')
def user_info02(user_id):
print(type(user_id))
return 'hello user {}'.format(user_id)
# <转换器名key:自定义参数名>
@app.route('/users/mobile/<mobile:mob_num>')
def user_info03(mob_num):
print(type(mob_num))
return 'user_info03 mobile is {}'.format(mob_num)
############################################################response响应#######################################################################
"""
访问静态文件 1> 将静态文件放入static目录中 2> 访问的URL xx/static/文件名
"""
"""
后端模板渲染
1> 将模板文件放入templates目录中, 并设置模板文件夹及模板语言
2> 使用render_template进行模板渲染
3> 在模板文件中替换内容
"""
############################################################response响应#######################################################################
# @app.route('/')
# def index():
# keyword = "黑马"
#
# return render_template('baidu.html', kw=keyword)
"""自定义响应对象"""
@app.route('/demo2')
def demo2():
# 视图函数可以返回str/bytes, 并且都会最终包装为Response响应对象
# 手动创建响应对象 主要目的为设置响应头
response = make_response("demo_test") # type: Response
response.headers['a'] = 10
return response
"""返回json"""
@app.route('/home/demo333333')
def demo3():
dict1 = {'name': 'zs', 'age': 20}
# json_str = json.dumps(dict1) # 没有指定content-type
# return json_str
# 可以将字典转为json字符串, 并且自动设置content-type为application/json
# return jsonify(dict1)
return jsonify(name='zs', age=20) # 也支持关键字实参的形式
"""重定向"""
@app.route('/demo4')
def demo4():
# return redirect('http://www.baidu.com')
# return redirect('/demo333333')
# 根据视图函数的标记获取URL
# url1 = url_for('demo3')
# print(url1)
# 如果想要获取视图函数的动态URL, 必须手动设置路由变量的值
url2 = url_for("demo5", user_id=11)
print(url2)
# URL发生变化, 代码也不需要修改, 有利于URL重构
return redirect(url_for("demo3"))
@app.route('/demo5/<user_id>')
def demo5(user_id):
return "demo5"
"""自定义状态码
目的是为了和前端进行交互, 可以制定一套自定义的交互规则
"""
@app.route('/demo6')
def demo6():
# return 响应体, 状态码, 响应头
return "demo6", 700, {"b": 20}
# Flask应用程序实例的run方法启动WEB服务器
if __name__ == '__main__':
print(app.url_map)
app.run(debug=True)
asgiref==3.4.1
click==8.0.1
colorama==0.4.4
Django==2.2.2
Flask==1.1.2
itsdangerous==2.0.1
Jinja2==3.0.1
MarkupSafe==2.0.1
PyMySQL==1.0.2
pytz==2021.1
sqlparse==0.4.1
Werkzeug==2.0.1
SECRET_KEY = 'TPmi4aLWRbyVq8zu9v82dWYW1'
\ No newline at end of file
from flask import Blueprint
# 1.创建蓝图对象
# 细节1: 可以使用url_prefix对蓝图注册的所有路由添加统一的资源段前缀
user_blu = Blueprint('user_b', __name__, static_folder='static', url_prefix='/user')
# 细节3: 蓝图设置请求钩子 只会监听该蓝图注册的路由
@user_blu.before_request
def news_prepare():
print("news_prepare")
# 只要出现ImportError: cannot import name xx, 一定是导入的内容没有被定义
# 解决办法: 查看并修改代码的执行顺序
# 4.让程序关联视图文件
from . import views # 从当前包中导入views文件
\ No newline at end of file
from flask import url_for
from flask import request
from user import user_blu
# 2.使用蓝图对象来注册路由
@user_blu.route('/')
def index():
# 细节2: 蓝图注册的路由, 其视图函数的标记为: 蓝图名.函数名
url1 = url_for('user_b.index')
return "个人中心-首页"
@user_blu.route('/basic_info')
def basic_info():
return "个人中心-基本信息"
@user_blu.route('/articles')
def get_articles():
channel_id = request.args.get('channel_id')
return 'you wanna get articles of channel {}'.format(channel_id)
@user_blu.route('/upload', methods=['POST'])
def upload_file():
f = request.files['pic']
# with open('./demo.png', 'wb') as new_file:
# new_file.write(f.read())
f.save('./demo.png')
return 'ok'
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册