flask基础first,入门基础

一、flask快速入门

  先安装flask包,pip install flask

from flask import Flask,request

app=Flask(__name__)

@app.route('/')   # 装饰器加括号和不加括号的区别,装饰器加括号就直接执行。不加就直接把下面的参数传进去。括号里面是路由路径。
def index():
    # 当前请求地址,当前请求携带过来的数据
    print(request.path)
    return 'hello world'

@app.route('/hello')
def hello():
    print(request.path)
    return 'hello hellohello'

if __name__ == '__main__': app.run() # 请求来了,会执行 app(request)对象,对象加括号触发__call__方法

 

二、2 登录,显示用户信息-小案例

  建立的.py文件里面

from flask import Flask,render_template,request,redirect,session,url_for

app = Flask(__name__)

app.debug = True                    #表示调试模式

app.secret_key = 'sdfsdfsdfsdf'     #和django settings里面的密钥一个意思,自己随便配就可以了。

USERS = {
    1:{'name':'张三','age':18,'gender':'','text':"道路千万条"},
    2:{'name':'李四','age':28,'gender':'','text':"安全第一条"},
    3:{'name':'王五','age':18,'gender':'','text':"行车不规范"},
}

@app.route('/detail/<int:nid>',methods=['GET'])  #<int:nid>相当于前端传的数字,比如查看第一个人的信息,路由就是detaile/1.
def detail(nid): user = session.get('user_info') if not user: return redirect('/login') #重定向redirect(www.baidu.com) 直接更路由 info = USERS.get(nid) return render_template('detail.html',info=info) #返回html界面 @app.route('/index',methods=['GET']) def index(): user = session.get('user_info') if not user: # return redirect('/login') url = url_for('ll') #用于反向解析 return redirect(url) return render_template('index.html',user_dict=USERS) @app.route('/login',methods=['GET','POST'],endpoint='l1') #此时的endpoint='ll',就是路由的别名,用于反向解析 def login(): if request.method == "GET": return render_template('login.html') else: # request.query_string
     '''
      post提交过来的数据放在了form中
      get提交过来的数据放在了query_string中
      两种取值方法就是直接在放置的对象后用get取值即可
     ''' user = request.form.get('user') pwd = request.form.get('pwd') if user == 'cxw' and pwd == '123': session['user_info'] = user #此时就是设置session,在session中放入key和value,即'user_info':user return redirect('http://www.baidu.com') return render_template('login.html',error='用户名或密码错误',aa='xxx',bb='zzz')
      #此时向前端返回信息,返回什么就直接在括号里加,比如上面括号里想返回的aa,bb。而不像django里面全部放在一个字典里返回
if __name__ == '__main__': app.run()

  在跟文件夹下新建一个模板文件夹templates,用来存放html文件

    detail.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <h1>详细信息 {{info.name}}</h1>
    <div>
        {{info.text}}
    </div>
</body>
</html>

    index.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <h1>用户列表</h1>
    <table>
        {% for k,v in user_dict.items() %}
        <tr>
            <td>{{k}}</td>
            <td>{{v.name}}</td>
            <td>{{v['name']}}</td>
            <td>{{v.get('name')}}</td>          //字典里面至此各种取值方式,v.name,v['name'],v.get{'name'},而django只支持v.name
 <td><a href="/detail/{{k}}">查看详细</a></td> </tr> {% endfor %} </table> </body> </html>

    login.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <h1>用户登录</h1>
    <form method="post">
        <input type="text" name="user">
        <input type="text" name="pwd">
        <input type="submit" value="登录">{{error}}
     {{aa}}
     {{bb}}
</form> </body> </html>

以上总结:

1 三板斧
    -return 字符串
    -return render_template('index.html')
    -return redirect('/login')

2 路由写法(路径,支持的请求方式,别名)
 @app.route('/login',methods=['GET','POST'],endpoint='l1')       如果别名不写,那么就用函数名作为别名,比如此时就是login自己作为别名,且endpoint不可重名

 路由本质就是self.add_url_rule

  实际上可以要装饰器,而直接在self.add_url_rule里面注册路由。self.add_url_rule('/login',view_func=login)即可

3 模板语言渲染
    -同dtl,但是比dtl强大,支持加括号执行,字典支持中括号取值和get取值

4 分组(django中的有名分组)
    @app.route('/detail/<int:nid>',methods=['GET'])
    def detail(nid):

5 反向解析
    -url_for('别名')

6 获取前端传递过来的数据
    # get 请求
        request.query_string
    # post请求
      user = request.form.get('user')
      pwd = request.form.get('pwd')

7多个装饰器执行顺序问题

  从上到下依次执行

8 配置文件
  方式一

  app的配置文件全在config当中,但是debug会直接提到app这一层
    app.config['DEBUG'] = True 或者 app.debug=True
    PS: 由于Config对象本质上是字典,所以还可以使用        app.config.update(...)
  方式二
    #通过py文件配置
    app.config.from_pyfile("python文件名称")
    如:

      app.config.from_pyfile("settings.py")

      然后新建一个settings.py文件配置debug

        DEBUG = True
  方式三
    app.config.from_object('mysettings.TestingConfig')

    然后再mysettings.py里面写配置:此时就可以配置开发时候用的文件,也可以配置上线时的文件。更为方便

    class Config(object):
        DEBUG = False
        TESTING = False
        DATABASE_URI = 'sqlite://:memory:'

    class ProductionConfig(Config):
        DATABASE_URI = 'mysql://user@localhost/foo'

    class DevelopmentConfig(Config):
        DEBUG = True

    class TestingConfig(Config):
        TESTING= True

 

三、路由系统

1 基本使用
@app.route('/detail/<int:nid>',methods=['GET'],endpoint='detail')

转换器:就是路由里面的<int:nid>
DEFAULT_CONVERTERS = {
    'default':         UnicodeConverter,
    'string':           UnicodeConverter,
    'any':              AnyConverter,
    'path':             PathConverter,
    'int':                IntegerConverter,
    'float':             FloatConverter,
    'uuid':             UUIDConverter,
}

2.路由的本质

1.本质就是:app.add_url_rule()

  endpoint:如果不写默认是函数名,endpoint不能重名
2.app.addurlrule参数
@app.route和app.add_url_rule参数:
  rule,                                     URL规则就是你写的路径 ''/login"
  view_func,                           视图函数名称就是视图函数def 后面的名称
  defaults = None,                  默认值, 当URL中无参数,函数需要参数时,使用defaults = {'k': 'v'},传一些默认参数

  为函数提供参数
    endpoint = None, 名称,用于反向生成URL,即: url_for('名称')
    methods = None, 允许的请求方式,如:["GET", "POST"]

  #对URL最后的 / 符号是否严格要求,默认严格,False,就是不严格
    strict_slashes = None
      '''
          @app.route('/index', strict_slashes=False)
          #访问http://www.xx.com/index/ 或http://www.xx.com/index均可
          @app.route('/index', strict_slashes=True)
          #仅访问http://www.xx.com/index
      '''

  #重定向到指定地址

    redirect_to = None, 
      '''
          @app.route('/index/<int:nid>', redirect_to='/home/<nid>')     #访问index就直接重定向了
      '''

四、CBV

  此时就要写类了

from flask import Flask,request,render_template,redirect
from flask import views

app=Flask(__name__)

#一般不继承View
# class IndexView(views.View):
#     methods = ['GET']
#     # decorators = [auth, ]
#     def dispatch_request(self):
#         print('Index')
#         return 'Index!'

#登录认证装饰器 def auth(func): def inner(*args, **kwargs): print('before') result = func(*args, **kwargs) print('after') return result return inner

#一般继承更高的MethodView
class IndexView(views.MethodView): methods = ['GET'] # 指定运行的请求方法 # 登录认证装饰器 decorators = [auth, ] #加多个就是从上往下的效果 def get(self): print('xxxxx') return "我是get请求" def post(self): return '我是post请求' # 路由注册 # IndexView.as_view('index'),必须传name,且为别名,且必须指定别名 app.add_url_rule('/index',view_func=IndexView.as_view('index')) if __name__ == '__main__': app.run()

总结:

  # 继承views.MethodView,只需要写get,post,delete方法
  # 如果加装饰器decorators = [auth, ],列表里可以加多个
  # 允许的请求方法methods = ['GET'] ,列表里可以加多个

posted @ 2022-03-20 11:28  新入世界的小白  阅读(130)  评论(0编辑  收藏  举报