flaskWeb开发(基于python的web开发实战)-第一部分-Flask简介

本文介绍了基于Python的Flask Web开发,涵盖程序基本结构、模板引擎如Jinja2和Flask-Bootstrap,还包括自定义错误页面、动态路由、静态文件引用及flask-moment的日期时间本地化。此外,还涉及Web表单处理,如CSRF保护、表单渲染、重定向和flash消息。进一步讨论了数据库集成、电子邮件功能以及大型程序的结构设计。
摘要由CSDN通过智能技术生成

第二章 程序的基本结构

from flask import Flask
from flask import request  # 程序上下文包括current_app, g, 请求上下文包括request, session
from flask import make_response  # 用户构造返回对象
from flask import redirect  # 重定向
from flask import abort  # 处理错误

app = Flask(__name__)  # 创建flask实例,参数指定程序主模块的名字,决定了程序的根目录,以便稍后能够找到相对于程序根目录的资源文件位置


@app.route('/')
def index():
    user_agent = request.headers.get('User-Agent')  # flask 使用上下文使某些特定变量在一个线程中全局可访问,且不会影响其他线程
    return '<h1>hello world</h1><p>your browser is %s<p>' %user_agent


@app.route('/bad')
def index_bad():
    return '<h1>bad request</h1>', 400  # 返回状态码


@app.route('/make_response')
def index_make_response():
    response = make_response('<h1>This document carried a cookie!</h1>')
    response.set_cookie('ansewr', '42')
    return response

@app.route('/redirect')
def index_redirect():
    return redirect('/bad')

@app.route('/abort/<id>')
def index_abort(id):
    ids = ['1', 2, 3]
    if id not in ids:  # id默认传的是字符串
        abort(404)  # abort不会把控制权交还给视图函数,而是交给web服务器
    return id

@app.route('/user/<name>')
def user(name):
    return '<h1>hello, %s!<h1>' %name

@app.route('/user/str/<path:name>')  # 动态部分默认匹配字符串,也可以匹配定义的类型,flask支持int, float, path(字符串,但不把斜线视为分隔符)类型
def user_2(name):
    return '<h1>hello, %s!<h1>' %name

# flask 实现了四种请求钩子(before_first_request, before_request, after_request, teardown_request),可在视图函数之前或之后执行

if __name__ == '__main__':
    app.run(debug = True)

第三章 模板

包含:jinja2引擎,flask-bootstrap,自定义错误页面,动态路由,静态文件引用,flask-moment本地化日期时间
# hello.py
from datetime import datetime
from flask import Flask
from flask import render_template  # 函数把Jinja2模板引擎集成到了程序中
from flask import url_for  # 动态路由,也可以在html文件中使用

from flask.ext.bootstrap import Bootstrap
from flask.ext.moment import Moment

app = Flask(__name__)
bootstrap = Bootstrap(app)
moment = Moment(app)

@app.route('/')
def index():
    return render_template('index.html', current_time=datetime.utcnow())  # current_time供moment.js使用


@app.route('/user/<name>')
def user(name):
    return render_template('user.html', name=name)

@app.route('/bootstrap_test/<name>')
def bootstrap_test(name):
    return render_template('bootstrap_test.html', name=name)

@app.errorhandler(404)
def page_not_found(e):
    return render_template('404.html'), 404  # 自定义404页面

@app.route('/url_for_test/<name>')
def url_for_test(name):
    index_url = url_for('index', _external=True)  # _external 生成绝对地址
    user_url = url_for('user', name=name, page=2)  # name=name 动态部分作为关键字传入, page=2 额外参数
    return render_template('url_for_test.html', index_url=index_url, user_url=user_url)

if __name__ == '__main__':
    app.run(debug=True)

# base.html
<!--继承自 bootstrap/base.html,定义好了导航条的格式的基模板-->
<!--静态文件的导入-->

{% extends "bootstrap/base.html" %}
{% block title %}Flasky{% endblock %}
{% block head %}
{
   { super() }}
<link rel="shortcut icon" href="{
   { url_for('static', filename = 'favicon.ico') }}" type="image/x-icon">
<link rel="icon" href="{
   { url_for('static', filename = 'favicon.ico') }}" type="image/x-icon">
<!--默认flask会在static下寻找静态文件,对静态文件使用url_for如上-->
{% endblock %}
{% block navbar %}
    <div class="navbar navbar-inverse" role="navigation">
        <div class="container">
            <div class="navbar-header">
                <button type="button" class="navbar-toggle" data-toggle="collapse" data-target=".navbar-collapse">
                    <span class="sr-only">Toggle navigation</span>
                    <span class="icon-bar"></span>
                    <span class="icon-bar"></span>
                    <span class="icon-bar"></span>
                </button>
                <a class="navbar-brand" href="/">Flasky</a>
            </div>
            <div class="navbar-collapse collapse">
                <ul class="nav navbar-nav">
                    <li><a href="/">Home</a>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值