render_template

需要导入render_template;
接着在return的时候结果是render_template(‘xx.html’,xxx)

这个函数的第一
个参数是模板的文件名,随后的参数都是键 – 值对,表示模板中变量对应的具体值。

传递变量

即上面的xxx,传递的变量可以是普通变量,也可以是字典

普通变量

在html文件参数的后面,对应的是html中的变量名称和关联的视图函数中的变量名称

视图函数中定义:

  1. @index_page.route('/template')
  2. def template():
  3. name = "juha"
  4. return render_template ('index.html',name = name)

HTML中修改:

Jinjia2模板 - 图1

Jinjia2模板 - 图2

字典值

也可以通过字典**dict_name传值
默认情况下,视图函数中的变量名称就是字典中的变量名称。

视图函数中定义:

  1. @index_page.route('/template')
  2. def template():
  3. context = {'name' : "juha",'age':25}
  4. return render_template ('index.html',**context)

HTML修改:

Jinjia2模板 - 图3
Jinjia2模板 - 图4

流程控制

判断if

在HTML文件中编写
{% if 对象名%}
{{对象名.变量名}}
{% endif %}

循环for

{% for xx xx %}
xxxx
{% endfor %}

  1. @index_page.route('/template')
  2. def template():
  3. context = {}
  4. context['user'] = {'name' : "juha",'age':25}
  5. context['subject'] = ['english','math','Chinese']
  6. return render_template ('index.html',**context)

Jinjia2模板 - 图5
结果:
Jinjia2模板 - 图6

这里我遇到一个问题,就是context必须要提前定义为字典?
因为没有加context = {}时,访问网页就报错。

Jinjia2模板 - 图7

模板继承

模板继承允许构建一个包含站点共同元素的基本模板骨架,并定义子模块可以覆盖的块。

buleprint文件:

  1. @index_page.route('/extend_template')
  2. def extend_template():
  3. return render_template ('extend_template.html')

在template目录下建一个common文件夹,然后创建一个layout.html文件:

  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <title></title>
  5. </head>
  6. <h1>我是统一模板</h1>
  7. <body>
  8. {% block content %} {% endblock%}
  9. </body>
  10. </html>

在template目录下直接创建一个文件extend_template.html

  1. {% extends "common/layout.html" %}
  2. {% block content %}
  3. 我是子页面模板文件~
  4. {% endblock %}

然后访问:[http://127.0.0.1:5000/learning/extend_template](http://127.0.0.1:5000/learning/extend_template)很有趣的事情发生了

Jinjia2模板 - 图8

结合SQLAlchemy联通数据库

需要安装flask_sqlalchemy和mysqlclient【mysqlclient性能更好,装不了就用pymysql】

如果直接写数据库的信息在核心文件中,并且没有安装mysqlclient和pymysql的话。
app.config['SQLALCHEMY_DATABASE_URI'] = "mysql://xx:123456@xxxx/mysql"
会报错:
Jinjia2模板 - 图9
这里实际上我已经安装了pymysql了

结合另一个课程,发现这里有个默认的数据库驱动,于是手动把config改为了:
app.config['SQLALCHEMY_DATABASE_URI'] = "mysql+pymysql://xx:123456@xxxx/mysql"
然后,就正确了。

避免文件循环引用的问题,需要将文件分层。

启动文件、路由注册文件和核心变量文件。
这里有点需要注意,就是启动文件中要导入注册文件中的信息。

改完后的文件组成如下:

Jinjia2模板 - 图10

application.py

  1. from flask import Flask
  2. from flask_sqlalchemy import SQLAlchemy
  3. app = Flask(__name__)
  4. app.config['SQLALCHEMY_DATABASE_URI'] = "mysql+pymysql://xxx:123456@xxx/mysql"
  5. db = SQLAlchemy(app)

run.py

  1. from application import app
  2. from register import *
  3. @app.route('/')
  4. def hello():
  5. return "hello, home page"
  6. if __name__ == '__main__':
  7. app.run(debug=True,host='0.0.0.0')

register.py

  1. from blueprints import index_page
  2. from application import app
  3. from postController import control_page
  4. app.register_blueprint(index_page,url_prefix='/learning')
  5. app.register_blueprint(control_page,url_prefix='/control')

blueprint.py

  1. from flask import Blueprint,request,make_response,jsonify,render_template
  2. from sqlalchemy import text
  3. from application import db
  4. index_page = Blueprint("index_page",__name__)
  5. @index_page.route('/')
  6. def index():
  7. return "index page"
  8. @index_page.route('/me')
  9. def hello():
  10. return "hello, this is me"
  11. @index_page.route('/get')
  12. def get():
  13. var_a = request.args.get('a','Welcom')
  14. return 'request:%sparams:%s,var_a:%s'%(request.method,request.args,var_a)
  15. @index_page.route('/post',methods=['POST'])
  16. def post():
  17. var_b = request.values['b'] if 'b' in request.values else 'welcome'
  18. return 'request: %s; params: %s; var_b: %s;%s'%(request.method,request.args,var_b,request.values)
  19. @index_page.route('/upload',methods=['POST'])
  20. def upload():
  21. var_c = request.files['file'] if 'file' in request.files else None
  22. return 'request: %s; params: %s; var_c: %s; values:%s'%(request.method,request.files,var_c,request.values)
  23. @index_page.route('/text_get')
  24. def text_get():
  25. return "text/html"
  26. @index_page.route('/text_same')
  27. def text_same():
  28. response = make_response('text/html',200)
  29. return response
  30. @index_page.route('/json')
  31. def json():
  32. data = {'a':'Tom'}
  33. import json
  34. response = make_response(json.dumps(data))
  35. response.headers['Content-type'] = 'application/json'
  36. return response
  37. @index_page.route('/json_same')
  38. def json_same():
  39. data = {'b':'Jerry'}
  40. response = make_response(jsonify(data))
  41. return response
  42. @index_page.route('/template')
  43. def template():
  44. context = {}
  45. context['user'] = {'name' : "juha",'age':25}
  46. context['subject'] = ['english','math','Chinese']
  47. return render_template ('index.html',**context)
  48. @index_page.route('/extend_template')
  49. def extend_template():
  50. return render_template ('extend_template.html')
  51. @index_page.route('/db_select')
  52. def db_select():
  53. sql = text("select * from `user`")
  54. context = {}
  55. result = db.engine.execute(sql)
  56. context['result'] = result
  57. return render_template("db_data.html",**context)

postController.py【还没用】

  1. from flask import Blueprint,request,make_response,jsonify,render_template
  2. control_page = Blueprint("control_page",__name__)
  3. @control_page.route('/')
  4. def control():
  5. return "index page"

extend_template.html

  1. {% extends "common/layout.html" %}
  2. {% block content %}
  3. 我是子页面模板文件~
  4. {% endblock %}

layout.html

  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <title></title>
  5. </head>
  6. <h1>我是统一模板</h1>
  7. <body>
  8. {% block content %} {% endblock%}
  9. </body>
  10. </html>

db_data.html

  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <title></title>
  5. </head>
  6. <body>
  7. {% for i in result %}
  8. {{i['User']}}
  9. {% endfor %}
  10. </body>
  11. </html>

index.html

  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <title></title>
  5. </head>
  6. <body>
  7. <p>Hello This is tempalte page
  8. {% if user %}
  9. 姓名是{{user.name}},年龄是{{user.age}}
  10. {% endif %}
  11. </p>
  12. {% for i in subject %}
  13. {{i}}
  14. {% endfor %}
  15. </body>
  16. </html>