sardine2 / python

Life is short, I need python.
0 stars 0 forks source link

ch4 Web应用 #21

Open sardine2 opened 7 years ago

sardine2 commented 7 years ago

一个Web应用的本质就是:

浏览器发送一个HTTP请求;

服务器收到请求,生成一个HTML文档;

服务器把HTML文档作为HTTP响应的Body发送给浏览器;

浏览器收到HTTP响应,从HTTP Body取出HTML文档并显示。

所以,最简单的Web应用就是先把HTML用文件保存好,用一个现成的HTTP服务器软件,接收用户请求,从文件中读取HTML,返回。Apache、Nginx、Lighttpd等这些常见的静态服务器就是干这件事情的。

sardine2 commented 7 years ago

重看 ch4 的卡包,还是觉得很艰难。同学们的代码,再一次粉碎了我脆弱的信心...... 比如即使是客户端向服务端请求数据的方法,就有只用 'POST'/ 只用 'GET' / 两者混用的。 以 oneshot 的 cat-stride 的队友为例:

@simpleowwen 大猫

  1. 全部用 POST方法 来实现客户端向服务端请求数据;
  2. 表单 action属性填写为 ‘/’ 客户端提交和服务端返回都在同一个页面。 所以获得返回数据的区域需设置为一个变量。 即将index.html做成一个模板,变量部分用嵌套的大括号括起来。 路由中的'/'表明将之后的index函数注册为程序根目录(query_weather.py保存的目录)的处理程序,在该目录下index()才起作用。
  3. 判断代码 request.form.keys() 用来获取(判断) html 页面按下了哪个按钮,应该执行哪个函数。 然后用 request.form['\'] == '\' 获取表单上用户输入的查询城市名。

大猫核心代码:

    @app.route('/',methods=['GET','POST'])
        def index():
            weather = ''
            if request.method == 'POST':
                if 'query' in request.form.keys():
                    city_name = request.form['city_name']
                    weather = query_weather(city_name)
                elif 'history' in request.form.keys(): #
                    his_info = show_history()
                    return render_template('index.html',info=his_info)
                elif 'help' in request.form.keys(): #
                    help_info = show_help()
                    return render_template('index.html',info=help_info)
            return render_template('index.html',info=weather)

@gogu同学

  1. 全部用GET 方法 来实现客户端向服务端请求数据;表单 action属性填写为 @app.route('/query') / @app.route('/history') / @app.route('/help') 客户端提交和服务端返回不同的页面。 在 html 代码对应要写上 : {% if path == '/history' %} 等等备注。

  2. 判断代码 因为直接区分了路由路径,所以似乎不用区分 request.method == 'POST': 还是request.method == 'GET':,统统默认 GET 直接就走对应的函数?用 request.args.get()取数据,比如像下面这样:

 @app.route('/query')
    def query():
        city = request.args.get('city')

他的html模版用了 class,实在看得心塞~~ 比如 <form method="get" action="/query" class="ui action input"> 中的 class="ui action input"。

核心代码:

query_weather = weather.buildQuery(API_ADDRESS, KEY)
    app = Flask(__name__)
    history_list = []
@app.route('/')
def hello():
    return render_template(TEMPLATE)

@app.route('/query')
def query():
    city = request.args.get('city')
    record = query_weather(city)
    weather.save_record(history_list, record)
    return render_template(TEMPLATE, path=request.path,
                                     record=record)

@app.route('/history')
def history():
    return render_template(TEMPLATE, path=request.path,
                                     history=history_list)

@app.route('/help')
def help():
    return render_template(TEMPLATE, path=request.path)

@ shippou同学

同时用 HTTP的 'POST'和 'GET' 方法来传递参数,前者用来调用查询天气预报的函数,'GET'用来调用函数显示 help 和 history所渲染的页面。

核心代码:

app = Flask(__name__)
listH = []

@app.route('/', methods=['POST', 'GET'])
def getWeather():
    if request.method == 'POST':
        listA = []
        key = request.form['key']
        data = fetchWeather(key, 1)
    if 'status' in data:
        return render_template('main.html',
            weather='No result. Need Help?')
    else:
        a = sortData(data, key, 1)
        listH.append(a[0])
        listA.append(a[0].split(' '))
        listA=listA[0]
        del listA[0]
        return render_template('main.html',
            city=listA[0],
            weather=listA[1],
            temp=listA[2],
            wind=listA[3])

elif request.method == 'GET':

    if request.args.get('button') == 'Help':
        return render_template('main.html',
            help=' ')
    elif request.args.get('button') == 'History':
        return render_template('main.html',
            history=set(listH))
    else:
        return render_template('main.html')     

还有一种是 @fatfox2016 和 @yifan127 同学的,用了面向对象的代码,在观看过程中我感觉到了严重的不适~~并且在关闭后仍有一种在太空畅游的晕眩之感(不希望再经历)。

 @app.route('/', methods=['GET', 'POST'])
    def index():
        form = NameForm()
        if form.validate_on_submit():
            session['ipText']  =  wAPIT.ipCity() #'您所在地:' + ipCity['region'] + ipCity['city']userInput = form.name.data.strip()
            userInput = form.name.data.strip()

以上这都是什么鬼啊,我受到了来自一切 class defname()和 self. 深深的伤害~~

yifan127同学代码

我把自己之前的代码找出来重新学习了,然后想做一个在查询时可选择实时天气预报和5天预报的页面,问了@faketooth 教练说可以实现。。嗯,我准备有空就摸索一下。 总之,路还很漫长 ;(

gogu commented 7 years ago

GET 可以在地址栏直接查询内容,也可以把查询的结果页面复制地址给其他伙伴。

实用来说

sardine2 commented 7 years ago

@summerpenguin 同学做了非常详尽的注释:戳我 以及还有这个

sardine2 commented 7 years ago

啊,才发现 @gogu 同学居然 commented 这个 issue 了,现在明白啦,关于 GET的用法。多谢!