python web开发---flask
1、引入模板render_templete:render_template的功能是对先引入index.html,同时根据后面传入的参数,进行渲染
2、pycharm如何自动生成Html文档模板
输入 ! 后输入 Tab 键
3、flask框架的静态文件html应该放到根目录的 templates 文件中
return render_template("index.html")
渲染文件css应该放到根目录的 /static/css/下
渲染文件用jinja2的模板导入
<!doctype html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0"> <meta http-equiv="X-UA-Compatible" content="ie=edge"> <title>我的首页</title> <link rel="stylesheet" href="{{url_for('static',filename='css/style.css')}}"> </head> <body> <h1>Python Web课程</h1> <h2>课程内容</h2> <ul> <li>1</li> <li>2</li> <li>3</li> </ul> </body> </html>
4、https:默认443端口
http:默认80端口
5、后端传递给前端数据格式 返回json:使用jsonify实现
@app.route("/getinfo") def get_info(): info = { "name":"json", "age":18 } return jsonify(info)
6、标准ajax请求
$.ajax({
type:"get",
url:'/get_data'
dataType:"json",
success: function(data){
alert("数据获取成功")
},
error:function () {
alert(""数据请求失败)
}
});
7、路由规则:
请求方法相同时,不同路由哪个先注册哪个先生效
请求方法不一致时,允许一个路由访问不同的视图;
同一视图函数可以用多个路由访问
8、路由跳转(redirect)中url的写法:(页面跳转)
硬编码:
反向编码(url_for)
@app.route("/home") def login(): #home为html页面 url = url_for("home") return redirect(url)
9、路由转换器:
默认字符串规则(除了/以外的字符)
int:接受整数
float:接受浮点数
path:接受斜线
@app.route("/post/<int:post_id>") def get_post(post_id): return "这是第%d篇文章" %post_id
10、自定义路由转换器:
class PhoneNum(BaseConverter): def __init__(self,url_map,regex): super().__init__(url_map) self.regex =regex app.url_map.converters['re'] = PhoneNum @app.route("/call/<re(r'1\d{10}'):phone_number>") def call_phone(phone_number): return "正在拨打%s的电话" %phone_number
to_python方法:对返回的数据进行隐藏或其他操作
class PhoneNum(BaseConverter): def __init__(self,url_map,regex): super().__init__(url_map) self.regex =regex def to_python(self,value): return value[:3] + '****' + value[-4:] app.url_map.converters['re'] = PhoneNum @app.route("/call/<re(r'1\d{10}'):phone_number>") def call_phone(phone_number): return "正在拨打%s的电话" %phone_number
to_url:访问127.0.0.1:5000/my_brother 跳转到/call/123****5678(类似)
class PhoneNum(BaseConverter): def __init__(self,url_map,regex): super().__init__(url_map) self.regex =regex def to_python(self,value): return value[:3] + '****' + value[-4:] def to_url(self,value): return value[:3] + '****' + value[-4:] app.url_map.converters['re'] = PhoneNum @app.route("/call/<re(r'1\d{2}\*{4}\d{4}'):phone_number>") def call_phone(phone_number): return "正在拨打%s的电话" %phone_number @app.route("/call_my_brother") def call_my_brother(): url = url_for("call_phone",phone_number="13755667787") return redirect(url)
11、前端上传文件到后端
@app.route("/upload",method=["POST"]) def upload(): file = requests.files.get("pic") if file: file.save("./1.jpg") return "上传成功" return "上传失败"
12、通过Post表单的形式请求的数据Flask会直接解析成一个类自定的形式放到request.form中,这时request,data无法取到数据
通过post请求体的形式请求的数据可以用
request对象中包含了前端的请求数据
request.form.get | request.form.getlist(同名参数)
request.args.get:提取url中的参数,同时支持get跟post方式
request.args.getlist:提取url中的提取参数(含多个同名参数)
13、cookie的创建,保存,状态判断
后端 @app.route("/home") def index(): username = request.cookies.get('user') return render_template("index.html",username = username) @app.route("/register",methods= ["POST","GET"]) def register(): if request.method == "GET": return render_template('register.html') elif request.method == "POST": username=request.form.get("username") password=request.form.get("password") print(username,password) resp = make_response(redirect(url_for('index'))) resp.set_cookie("user",username,max_age=60) return resp
前端在Body加上判断
{% if username %}
欢迎你回来,{{ username }} <br>
{% else %}
游客请先<a href="/register">登录</a>
{% endif %}
14、g对象只存在于每次请求,下一次请求前清空
15、@app.before_first_request:第一次请求前
@app.before_request:每次请求前
@app.after_request:视图函数处理后执行,前提是视图不发生异常,有response参数
@app.teardown_request:无论视图是否发生异常,都会被执行
16、flask连接数据库的配置
from flask import Flask app =Flask(__name__) app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql://root:123456@127.0.0.1:3306/flask_project' app.comfig['SQLALCHEMY_TRACK_MODIFICATIONS'] = True app.comfig['SQLALCHEMY_ECHO'] = True
17、查看数据库表结构: desc 表名
18/数据库迁移
from flask_migrate import Migrate,MigrateCommand from flask_script import Manager manager = Manager(app) migrate = Migrate(app,db) manager.add_command('db',MigrateCommand)
19、
浙公网安备 33010602011771号