Python Flask 建站框架入门课程-微课学习-第三章 进阶

2023-11-10

上传文件

用 Flask 处理文件上传很简单。只要确保你没忘记在 HTML 表单中设置 enctype=“multipart/form-data” 属性,不然你的浏览器根本不会发送文件。

已上传的文件存储在内存或是文件系统中一个临时的位置。你可以通过请求对象的 files 属性访问它们。每个上传的文件都会存储在这个字典里。它表现近乎为一个标准的 Python file 对象,但它还有一个 save() 方法,这个方法允许你把文件保存到服务器的文件系统上。

我们以上传图片为例:假设将上传的图片只允许’png’、‘jpg’、‘jpeg’、‘gif’ 这四种格式,通过url/upload使用POST上传,上传的图片存放在服务器端的static/uploads目录下。

首先在项目HelloWorld中创建目录static/uploads, 这时候我们的目录结构为:

HelloWorld/
  ├ static/
  │  ├ uploads/
  ├ templates/
  ├ server.py
  ├ client.py

werkzeug库可以判断文件名是否安全

我们安装这个库

pip install werkzeug

server.py代码:

from flask import Flask, request
from werkzeug.utils import secure_filename
import os
 
app = Flask(__name__)
 
# 文件上传目录
app.config['UPLOAD_FOLDER'] = 'static/uploads/'
# 支持的文件格式
app.config['ALLOWED_EXTENSIONS'] = {'png', 'jpg', 'jpeg', 'gif'}  # 集合类型
 

# 判断文件名是否是我们支持的格式
def allowed_file(filename):
    return '.' in filename and \
           filename.rsplit('.', 1)[1] in app.config['ALLOWED_EXTENSIONS']
 

@app.route('/upload', methods=['POST'])
def upload():
    upload_file = request.files['image']
    if upload_file and allowed_file(upload_file.filename): # 上传前文件在客户端的文件名
        filename = secure_filename(upload_file.filename)
        # 将文件保存到 static/uploads 目录,文件名同上传时使用的文件名
        upload_file.save(os.path.join(app.root_path, app.config['UPLOAD_FOLDER'], filename))
        return 'info is '+request.form.get('info', '')+'. success'
    else:
        return 'failed'
 
 
if __name__ == '__main__':
    app.run(port=5000, debug=True)

app.config中的config是字典的子类,可以用来设置自有的配置信息,也可以设置自己的配置信息。

函数allowed_file(filename)用来判断filename是否有后缀以及后缀是否在app.config[‘ALLOWED_EXTENSIONS’]中。

upload_file是上传文件对应的对象。

app.root_path获取server.py所在目录在文件系统中的绝对路径。

upload_file.save(path)用来将upload_file保存在服务器的文件系统中,参数最好是绝对路径。函数os.path.join()用来将使用合适的路径分隔符将路径组合起来。

客户端client.py:

import requests
 
file_data = {'image': open('flask.jpg', 'rb')}
 
user_info = {'info': 'flask'}
 
r = requests.post("http://127.0.0.1:5000/upload", data=user_info, files=file_data)
 
print(r.text)

在这里插入图片描述
我们看到图片已经上传成功了
在这里插入图片描述
要控制上产文件的大小,可以设置请求实体的大小,例如:

app.config['MAX_CONTENT_LENGTH'] = 16 * 1024 * 1024 #16MB

不过,在处理上传文件时候,需要使用try:…except:…。

如果要获取上传文件的内容可以:

file_content = request.files['image'].stream.read()

在这里插入图片描述

Restful URL - 变量规则

简单来说,Restful URL可以看做是对 URL 参数的替代。

编辑server.py:

from flask import Flask
 
app = Flask(__name__)
 

@app.route('/user/<username>')
def user(username):
    print(username)
    print(type(username))
    return 'hello ' + username
 
 
@app.route('/user/<username>/friends')
def user_friends(username):
    print(username)
    print(type(username))
    return 'In user_friends get username: ' + username
 
 
if __name__ == '__main__':
    app.run(port=5000, debug=True)

运行server.py。使用浏览器访问http://127.0.0.1:5000/user/Loen,server.py将输出:
在这里插入图片描述
而访问http://127.0.0.1:5000/user/Loen/
在这里插入图片描述
浏览器访问http://127.0.0.1:5000/user/Loen/friends,可以看到:
在这里插入图片描述
在这里插入图片描述

转换类型

由上面的示例可以看出,使用 Restful URL 得到的变量默认为str对象。我们可以用flask内置的转换机制,即在route中指定转换类型。

编写server.py:

from flask import Flask
app = Flask(__name__)

@app.route('/page/<int:num>')
def page(num):
    print(num)
    print(type(num))
    return 'hello world'
 
 
if __name__ == '__main__':
    app.run(port=5000, debug=True)

@app.route(‘/page/int:num’)会将num变量自动转换成int类型。

运行上面的程序,在浏览器中访问 http://127.0.0.1:5000/page/1,server.py控制台将输出如下内容:
在这里插入图片描述
如果访问的是http://127.0.0.1:5000/page/loen,我们会得到404响应。

有3个默认的转换器:

int     接受整数
floatint ,但是接受浮点数
path     和默认的相似,但也接受斜线

在这里插入图片描述

编写转换器

自定义的转换器是一个继承werkzeug.routing.BaseConverter的类,修改to_python和to_url方法即可。

to_python方法用于将url中的变量转换后供被@app.route包装的函数使用,to_url方法用于flask.url_for中的参数转换。

下面是一个示例,将server.py修改如下:

from flask import Flask, url_for
from werkzeug.routing import BaseConverter
 
class MyIntConverter(BaseConverter):
 
    def __init__(self, url_map):
        super(MyIntConverter, self).__init__(url_map)
 
    def to_python(self, value):
        return int(value)
 
    def to_url(self, value):
        return value * 2
 
 
app = Flask(__name__)
app.url_map.converters['my_int'] = MyIntConverter
 
@app.route('/page/<my_int:num>')
def page(num):
    print(num)
    print(url_for('page', num='145'))   # page 对应的是 page函数 ,num 对应对应`/page/<my_int:num>`中的num,必须是str
    return 'hello world'
 
if __name__ == '__main__':
    app.run(port=5000, debug=True)

浏览器访问http://127.0.0.1:5000/page/28后,server.py的输出信息是:

28

/page/145145

使用url_for生成链接

工具函数url_for可以让你以软编码的形式生成url,提供开发效率。

编辑 server.py:

from flask import Flask, url_for
app = Flask(__name__)

@app.route('/')

def hello_world():

    pass

 

@app.route('/user/<name>')

def user(name):

    pass

 

@app.route('/page/<int:num>')

def page(num):

    pass


@app.route('/test')
def test():
    print(url_for('test'))
    print(url_for('user', name='loen'))
    print(url_for('page', num=1, q='welcome to w3c 15%2'))
    print(url_for('static', filename='uploads/flask.jpg'))
    return 'Hello'
 
if __name__ == '__main__':
    app.run(debug=True)

运行server.py。然后在浏览器中访问http://127.0.0.1:5000/test,server.py控制台将输出以下信息:
在这里插入图片描述
为什么你要构建 URL 而非在模板中硬编码?这里有三个绝妙的理由:

反向构建通常比硬编码的描述性更好。更重要的是,它允许你一次性修改 URL, 而不是到处边找边改。
URL 构建会转义特殊字符和 Unicode 数据,免去你很多麻烦。
如果你的应用不位于 URL 的根路径(比如,在 /myapplication 下,而不是 / ), url_for() 会妥善处理这个问题
在这里插入图片描述

使用redirect重定向网址

运行server.py,在浏览器中访问http://127.0.0.1:5000/old,浏览器的url会变成http://127.0.0.1:5000/new,并显示:redirect函数用于重定向,实现机制很简单,就是向客户端(浏览器)发送一个重定向的HTTP报文,浏览器会去访问报文中指定的url。

使用redirect时,给它一个字符串类型的参数就行了。

编辑 server.py:

from flask import Flask, url_for, redirect
 
app = Flask(__name__)
 
@app.route('/old')
def old():
    print('this is old')
    return redirect(url_for('new'))
 
@app.route('/new')
def new():
    print('this is new')
    return 'this is new'
 
if __name__ == '__main__':
    app.run(debug=True)

运行server.py,在浏览器中访问http://127.0.0.1:5000/old,浏览器的url会变成http://127.0.0.1:5000/new,并显示:
在这里插入图片描述
server.py 控制台显示
在这里插入图片描述
在这里插入图片描述

jinja2

jinja2是Flask作者开发的一个模板系统,起初是仿django模板的一个模板引擎,为Flask提供模板支持,由于其灵活,快速和安全等优点被广泛使用。

jinja2的优点
jinja2之所以被广泛使用是因为它具有以下优点:

相对于Template,jinja2更加灵活,它提供了控制结构,表达式和继承等。
相对于Mako,jinja2仅有控制结构,不允许在模板中编写太多的业务逻辑。
相对于Django模板,jinja2性能更好。
Jinja2模板的可读性很棒。
jinja2语法
作为一个模板系统,它还提供了特殊的语法,我们按照它支持的语法进行编写之后,就能使用jinja2模块进行渲染。基本语法在jinja2中,存在三种语法:

1.控制结构 {% %}

2.变量取值 {{ }}

3.注释 {# #}

下面是一个简单的jinja2例子:

{# This is jinja code #} 
{% for file in filenames %}
...
{% endfor %}

可以看到,for循环的使用方式和Python比较类似,但是没有了句尾的冒号,另外需要使用endfor做为结尾,

其实在jinja2中,if也是一样的,结尾需要使用endif
在这里插入图片描述

jinja2变量

jinja2模板中使用 {{ }} 语法表示一个变量,它是一种特殊的占位符。

当利用jinja2进行渲染的时候,它会把这些特殊的占位符进行填充/替换,jinja2支持python中所有的Python数据类型比如列表、元组、对象等。

<p>this is a dicectory:{{ mydict['key'] }} </p>
<p>this is a list:{{ mylist[3] }} </p>
<p>this is a object:{{ myobject.something() }} </p> 

jinja2中的过滤器

变量可以通过“过滤器”进行修改,过滤器可以理解为是jinja2里面的内置函数和字符串处理函数。常用的过滤器有:
在这里插入图片描述
如何使用这些过滤器呢?

只需要在变量后面使用管道 | 分割,多个过滤器可以链式调用,前一个过滤器的输出会作为后一个过滤器的输入

{{ 'abc' | captialize  }}
# Abc
{{ 'abc' | upper  }}
# ABC
{{ 'hello world' | title  }}
# Hello World
{{ "hello world" | replace('world','Loen') | upper }}
# HELLO LOEN
{{ 16.18 | round | int }}
# 16 

在这里插入图片描述

{{ “hello Nier” | replace(‘hello’,‘Loen’) | upper }}

最开始是hello Nier,然后使用replace将前一个的hello替换为Loen,

现在字符串为Loen Nier,最后使用upper将字符串全部转化为大写

结果为LOEN NIER

jinja2的for循环

jinja2中的for循环用于迭代Python的数据类型,包括列表,元组和字典。在jinja2中不存在while循环。迭代列表

<ul>
{% for user in users %}
<li>{{ user.username|title }}</li>
{% endfor %}
</ul>

迭代字典

<dl>
{% for key, value in my_dict.iteritems() %}
<dt>{{ key }}</dt>
<dd>{{ value}}</dd>
{% endfor %}
</dl> 

当然也可以加入else语句,在循环正确执行完毕后执行

jinja2的宏

宏类似于Python中的函数,我们在宏中定义行为,还可以进行传递参数,就像Python中的函数一样。在宏中定义一个宏的关键字是macro,后面跟其 宏的名称和参数等

{% macro input(name,age=18) %}   # 参数age的默认值为18
 <input type='text' name="{{ name }}" value="{{ age }}" >
{% endmacro %} 

调用方法也和Python的类似

<p>{{ input('Loen') }} </p>
<p>{{ input('Loen',age=28) }} </p> 

在这里插入图片描述

jinja2的继承和Super函数

jinja2中最强大的部分就是模板继承。

模板继承允许我们创建一个基本(骨架)文件,其他文件从该骨架文件继承,然后针对自己需要的地方进行修改。

jinja2的骨架文件中,利用block关键字表示其包涵的内容可以进行修改。

以下面的骨架文件base.html为例:

<!DOCTYPE html>
<html lang="en">
<head>
    {% block head %}
    <link rel="stylesheet" href="style.css"/>
    <title>{% block title %}{% endblock %} - My Webpage</title>
    {% endblock %}
</head>
<body>
<div id="content">{% block content %}{% endblock %}</div>
<div id="footer">
    {% block  footer %}
    <script>This is javascript code </script>
    {% endblock %}
</div>
</body>
</html> 

这里定义了四处 block,即:head,title,content,footer。

那怎么进行继承和变量替换呢?

注意看下面的文件

{% extend "base.html" %}       # 继承base.html文件
{% block title %} Dachenzi {% endblock %}   # 定制title部分的内容
{% block head %}
    {{  super()  }}        # 用于获取原有的信息
    <style type='text/css'>
    .important { color: #FFFFFF }
    </style>
{% endblock %}    
# 其他不修改的原封不同的继承

注意: super()函数 表示获取block块中定义的原来的内容

使用Jinja2模板引擎

在模板里,你也可以访问 request 、 session 和 g [1] 对象, 以及 get_flashed_messages() 函数。Flask与模板相关的函数有:

flask.render_template(template_name_or_list, **context)
flask.render_template_string(source, **context)
flask.get_template_attribute(template_name, attribute)
这个实例中使用了模板继承、if判断、for循环。
创建并编辑 templates/default.html

<html>

<head>

    <title>

        {% if page_title %}

            {{ page_title }}

        {% endif %}

    </title>

</head>

<!--

在``标签中使用了if判断,如果给模板传递了`page_title`变量,显示之,否则,不显示。

-->

<body>

 

{% block body %}

    {% for key in user_info %}

        <p>{{ key }}: {{ user_info[key] }} </p>

        

    {% endfor %}

{% endblock %}

变量user_info应该是一个字典,for循环用来循环输出键值对。
编辑 server.py

from flask import Flask, render_template
 
app = Flask(__name__)
 
@app.route('/user')
def user():
    user_info = {
        'name': 'loen',
        'email': '425389019@qq.com',
        'age':0,
        'github': 'https://github.com/lucoo01'
    }
    return render_template('default.html', page_title='loen\'s info', user_info=user_info)
 
if __name__ == '__main__':
    app.run(port=5000, debug=True)

render_template()函数的第一个参数指定模板文件,后面的参数是要传递的数据。
运行 server.py 在浏览器中访问http://127.0.0.1:5000/user,效果图如下:
在这里插入图片描述
查看网页源码:
在这里插入图片描述
注: 在模板里,你也可以访问 request 、 session 和 g 对象, 以及 get_flashed_messages() 函数
在这里插入图片描述

自定义404等错误的响应

要处理HTTP错误,可以使用flask.abort函数。

编辑server.py:

from flask import Flask, render_template_string, abort
app = Flask(__name__)

@app.route('/user')
def user():
    abort(401)  # Unauthorized 未授权
    print('Unauthorized, 请先登录')
 
 
if __name__ == '__main__':
    app.run(port=5000, debug=True)

运行 server.py,浏览器访问http://127.0.0.1:5000/user,效果如下:
在这里插入图片描述
要注意的是,server.py中abort(401)后的print并没有执行。
在这里插入图片描述

自定义错误页面

编辑server.py:

from flask import Flask, render_template_string, abort
app = Flask(__name__)
 
@app.route('/user')
def user():
    abort(401)  # Unauthorized
 
@app.errorhandler(401)
def page_unauthorized(error):
    return render_template_string('<h1> Unauthorized </h1><h2>{{ error_info }}</h2>', error_info=error), 401
 
if __name__ == '__main__':
    app.run(port=5000, debug=True)

page_unauthorized 函数返回的是一个元组,401 代表HTTP 响应状态码。

如果省略401,则响应状态码会变成默认的 200。

运行 server.py,浏览器访问 http://127.0.0.1:5000/user,效果如下:
在这里插入图片描述
在这里插入图片描述

用户会话

session 用来记录用户的登录状态,一般基于cookie实现。

编辑 server.py

from flask import Flask, render_template_string, \
    session, request, redirect, url_for
app = Flask(__name__)
 
app.secret_key = 'LoenDSdtj\9bX#%@!!*(0&^%)'
 

@app.route('/login')
def login():
    page = '''
    <form action="{{ url_for('do_login') }}" method="post">
        <p>name: <input type="text" name="user_name" /></p>
        <input type="submit" value="Submit" />
    </form>
    '''
    return render_template_string(page)
 
 
@app.route('/do_login', methods=['POST'])
def do_login():
    name = request.form.get('user_name')
    session['user_name'] = name
    return 'success'
 
 
@app.route('/show')
def show():
    return session['user_name']
 
 
@app.route('/logout')
def logout():
    session.pop('user_name', None)
    return redirect(url_for('login'))
 
 
if __name__ == '__main__':
    app.run(port=5000, debug=True)

代码的含义

app.secret_key用于给session加密。

在/login中将向用户展示一个表单,要求输入一个名字,submit后将数据以post的方式传递给/do_login,/do_login将名字存放在session中。

如果用户成功登录,访问/show时会显示用户的名字。此时,打开调试工具,选择session面板,会看到有一个cookie的名称为session。

/logout用于登出,通过将session中的user_name字段pop即可。Flask中的session基于字典类型实现,调用pop方法时会返回pop的键对应的值;如果要pop的键并不存在,那么返回值是pop()的第二个参数。

另外,使用redirect()重定向时,一定要在前面加上return。

进入http://127.0.0.1:5000/login,输入name,点击submit:
在这里插入图片描述

在这里插入图片描述

设置session的有效时间

设置session的有效时间设置为5分钟

from datetime import timedelta
from flask import session, app
 
session.permanent = True
app.permanent_session_lifetime = timedelta(minutes=5)

在这里插入图片描述

使用Cookie

Cookie是存储在客户端的记录访问者状态的数据。

常用的用于记录用户登录状态的session大多是基于cookie实现的。

cookie可以借助flask.Response来实现。

修改server.py:

from flask import Flask, request, Response, make_response
import time
 
app = Flask(__name__)
 
@app.route('/add')
def login():
    res = Response('add cookies')
    res.set_cookie(key='name', value='loen', expires=time.time()+6*60)
    return res
 
 
@app.route('/show')
def show():
    return request.cookies.__str__()
 
 
@app.route('/del')
def del_cookie():
    res = Response('delete cookies')
    res.set_cookie('name', '', expires=0)
    return res
 
 
if __name__ == '__main__':
    app.run(port=5000, debug=True)

使用Response.set_cookie添加和删除cookie。

expires参数用来设置cookie有效时间,值可以是datetime对象或者unix时间戳。

res.set_cookie(key='name', value='loen', expires=time.time()+6*60)

上面的expire参数的值表示cookie在从现在开始的6分钟内都是有效的。

要删除cookie,将expire参数的值设为0即可:

res.set_cookie('name', '', expires=0)

运行与测试
运行 server.py:
使用浏览器打开http://127.0.0.1:5000/add,浏览器界面会显示
在这里插入图片描述
下面查看一下cookie, 我用的是chrome自带的开发者工具, 在chrome界面按F12
在这里插入图片描述
在这里插入图片描述

闪存系统 flashing system

Flask 的闪存系统(flashing system)用于向用户提供反馈信息,这些反馈信息一般是对用户上一次操作的反馈。

反馈信息是存储在服务器端的,当服务器向客户端返回反馈信息后,这些反馈信息会被服务器端删除。

编写 server.py

from flask import Flask, flash, get_flashed_messages
import time
 
app = Flask(__name__)
app.secret_key = 'some_secret'

@app.route('/')
def index():
    return 'Hello index'
 
 
@app.route('/gen')
def gen():
    info = 'access at '+ time.time().__str__()
    flash(info)
    return info
 
 
@app.route('/show1')
def show1():
    return get_flashed_messages().__str__()
 
 
@app.route('/show2')
def show2():
    return get_flashed_messages().__str__()
 
 
if __name__ == "__main__":
    app.run(port=5000, debug=True)

运行 server.py:

打开浏览器,访问http://127.0.0.1:5000/gen,浏览器界面显示(注意,时间戳是动态生成的,每次都会不一样,除非并行访问):
在这里插入图片描述
查看浏览器的cookie,可以看到session,随着gen页面的生成不断变化:
在这里插入图片描述
访问show1 得到的列表内容 是之前访问http://127.0.0.1:5000/gen得到的内容。此时,cookie中已经没有session了。

如果使用浏览器访问http://127.0.0.1:5000/show1或者http://127.0.0.1:5000/show2,只会得到空
在这里插入图片描述
flash系统也支持对flash的内容进行分类。修改server.py内容:

from flask import Flask, flash, get_flashed_messages
import time
 
app = Flask(__name__)
app.secret_key = 'some_secret'
 
 
@app.route('/')
def index():
    return 'Hello Index'
 
 
@app.route('/gen')
def gen():
    info = 'access at '+ time.time().__str__()
    flash('show1 '+info, category='show1')
    flash('show2 '+info, category='show2')
    return info
 
 
@app.route('/show1')
def show1():
    return get_flashed_messages(category_filter='show1').__str__()
 
@app.route('/show2')
def show2():
    return get_flashed_messages(category_filter='show2').__str__()
 
 
if __name__ == "__main__":
    app.run(port=5000, debug=True)

不过,由上面的代码可以知道,此时生成了两个flash信息,但分类(category)不同。

使用浏览器访问http://127.0.0.1:5000/show1,得到如下内容:
在这里插入图片描述
而继续访问http://127.0.0.1:5000/show2,得到的内容为空:

在模板文件中获取flash的内容

在Flask中,get_flashed_messages()默认已经集成到Jinja2模板引擎中,易用性很强。下面是来自官方的一个示例:

{% with messages = get_flashed_messages(with_categories=true) %}
    {% if messages %}
    <ul>
        {% for category, message in messages %}
        <li class="{{ category }}">{{ message }}</li>
        {% endfor %}
    </ul>
    {% endif %}
{% endwith %}

在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Python Flask 建站框架入门课程-微课学习-第三章 进阶 的相关文章

  • 如何把父母和孩子联系起来?

    有两个简单的类 一个只有parent属性 并且两者兼而有之parent and children属性 这意味着同时具备两者的人parent and children继承自唯一的parent 这是只有parent属性 我们就这样称呼它吧Chi
  • 从所有数据帧列中删除子字符串

    我有一个单词列表 大约 1000 个单词 我称之为负面单词 CAST ARTICLES SANITARY JAN CLAUSES SPECIAL ENDORSEMENT 我很快就会用这个单词列表制作一个数据框 我还有一个数据框 看起来像 F
  • docker 容器中的“(pygame parachute)分段错误”

    尝试在 docker 容器中使用 pygame 时出现以下错误 我想从容器中获取显示 Fatal Python error pygame parachute Segmentation Fault 重现 Docker已安装 docker ru
  • 如何同时运行多个功能[关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我有以下代码 my func1 my func2 my func3 my func4 my func5 是否可以同时计算函数的数据 而
  • DynamodB:如何更新排序键?

    该表有两个键 filename 分区键 和eventTime 排序键 我要更新eventTime对于某些filename Tried put item and update item 发送相同的filename与新的eventTime但这些
  • Python 不考虑 distutils.cfg

    我已经尝试了给出的所有内容 并且所有教程都指向相同的方向 即使用 mingw 作为 python 而不是 Visual C 中的编译器 我确实有 Visual C 和 mingw 当我想使用 pip 安装时 问题开始出现 它总是给Unabl
  • Python:json_normalize pandas 系列给出 TypeError

    我在 pandas 系列中有数万行像这样的 json 片段df json IDs lotId 1 Id 123456 date 2009 04 17 bidsCount 2 IDs lotId 2 Id 123456 date 2009 0
  • 将整数系列转换为交替(双元)二进制系列

    我不知道如何最好地表达这个问题 因为在这里谷歌搜索和搜索总是让我找到更复杂的东西 我很确定这是基本的东西 但对于我的生活来说 我找不到一个好的方法来做到这一点下列 给定一个整数序列 比如说 for x in range 0 36 我想将这些
  • 动态字段取决于 WTForms 的先前字段

    我正在使用 WTForms 制作表格 目前 我有这个 class UploadForm flask wtf Form fichier wtforms fields FileField u Fichier description wtform
  • 列表推导式和 for 循环中的 Lambda 表达式[重复]

    这个问题在这里已经有答案了 我想要一个 lambda 列表 作为一些繁重计算的缓存 并注意到这一点 gt gt gt j for j in lambda i for i in range 10 9 9 9 9 9 9 9 9 9 9 Alt
  • 我可以用关闭的文件对象做什么?

    当您打开文件时 它存储在一个打开的文件对象中 该对象使您可以访问该文件的各种方法 例如读取或写入 gt gt gt f open file0 gt gt gt f
  • Pandas 字典键到列[重复]

    这个问题在这里已经有答案了 我有一个像这样的数据框 index column1 e1 u c680 5 u c681 1 u c682 2 u c57 e2 u c680 6 u c681 2 u c682 1 u c57 e3 u c68
  • Snakemake:将多个输入用于具有多个子组的一个输出的规则

    我有一个工作管道 用于下载 比对和对公共测序数据执行变体调用 问题是它目前只能在每个样本的基础上工作 i e作为每个单独测序实验的样本 如果我想对一组实验 例如样本的生物和 或技术复制 执行变体调用 则它不起作用 我试图解决它 但我无法让它
  • 哪种方式最适合Python工厂注册?

    这是一个关于这些方法中哪一种被认为是最有效的问题 Pythonic 我不是在寻找个人意见 而是在寻找惯用的观点 我的背景不是Python 所以这会对我有帮助 我正在开发一个可扩展的 Python 3 项目 这个想法类似于工厂模式 只不过它是
  • 根据标点符号列表替换数据框中的标点符号[重复]

    这个问题在这里已经有答案了 使用 Canopy 和 Pandas 我有数据框 a 其定义如下 a pd read csv text txt df pd DataFrame a df columns test test txt 是一个单列文件
  • 将 Django 中的所有视图限制为经过身份验证的用户

    我是 Django 新手 我正在开发一个项目 该项目有一个登录页面作为其索引和一个注册页面 其余页面都必须仅限于登录用户 如果未经身份验证的用户尝试访问这些页面 则必须将他 她重定向到登录页面 我看到 login required装饰器会将
  • 从给定的项目列表创建子列表

    我首先要说的是以下问题不是为了家庭作业目的即使因为我几个月前就完成了软件工程师的工作 无论如何 今天我正在工作 一位朋友向我询问了这个奇怪的排序问题 我有一个包含 1000 行的列表 每行代表一个数字 我想创建 10 个子列表 每个子列表都
  • AWS 将 MQTT 消息存储到 DynamoDB

    我构建了一个定期发送 MQTT 消息的 python 脚本 这是发送到后端的 JSON 字符串 Id 1234 Ut 1488395951 Temp 22 86 Rh 48 24 在后端 我想将 MQTT 消息存储到 DynamoDB 表中
  • 检查 IP 地址是否在给定范围内

    我想检查一下是否有IP180 179 77 11位于特定范围之间 例如180 179 0 0 180 179 255 255 我编写了一个函数 它将每个 IP 八位字节与其他八位字节进行比较 def match mask IP min ip
  • PyObjC + Python 3.0 问题

    默认情况下 Cocoa Python 应用程序使用默认的 Python 运行时版本 2 5 如何配置我的 Xcode 项目以便它使用较新的 Python 3 0 运行时 我尝试用新版本替换项目中包含的Python framework 但它不

随机推荐

  • nginx 重启/停止/退出失败

    启动Nginx时候报错 nginx error open usr local nginx logs nginx pid failed 2 No such file or directory 这句话的意思就是 你的nginx pid 打开失败
  • linux tcp优雅关闭,优雅地关闭Socket;检测非正常断开的TCP连接

    转载声明 本文所有版权归原作者所有 如本文原作者不认可转载 请联系本空间删除 相关资源 NA 如何优雅地
  • 集群搭建--安装apache-hive-2.3.4

    本文安装的是 apache hive 2 3 4 bin tar gz 其下载地址为 路径 https pan baidu com s 1ZPJxbGdpjW0fPpKUa7RX6Q 提取码 i58e 解压 apache hive 2 3
  • Hash函数加密算法(一)

    一 使用密码学的目的 保密性 防止用户的标识或数据被读取 l 身份验证 确保数据发自特定的一方 数据完整性 防止数据被更改 二 加密算法的分类 1 对称加密 采用对称秘钥的加密系统加密 解密过程均采用同一把秘钥 通信双方必须同时获得这把钥匙
  • windows操作系统上启用SSLv3协议引发的威胁

    一 主机启用SSLv3协议引发的威胁 远程主机受到称为POODLE的中间人 MitM 信息泄露漏洞的影响 该漏洞是由于SSL 3 0在解密使用密码块链接 CBC 模式下的块密码加密的消息时处理填充字节的方式 二 建议处置措施 处置措施 禁用
  • Linux如何修改ip地址

    参考 3 Ways to change ip address in Linux howtouselinux Ubuntu篇 一 Desktop版方法 如果你使用了Desktop版本或者server版上面加了desktop桌面 那么你就尽量使
  • DELPHI支付宝支付代码

    真实业务场景的考虑 按照支付宝或者微信支付的开发手册的说法 一个标准的客户端接入支付业务模型应该是这样的 我忽略时序图 只用文字描述 用户登录客户端 选择商品 然后点击客户端支付 客户端收集商品信息 然后调用自己业务平台的预付款接口 业务平
  • 基于Jenkins+git+gradle的android持续集成

    本文参考了 http my oschina net uboluo blog 157483 http java dzone com articles automating continuous 以前都是通过IDE eclipse or And
  • PageHelper分页查询数据错乱,有些数据不显示,和数据库查询对不上

    今天遇到一个很意外的错误 使用PageHelper分页查询时 分页的数据总是和数据库查询的对不上 分页代码如下 public ReturnInfo getManage RequestPage
  • 机器学习——几种分类算法的汇总

    https www cnblogs com Zhi Z p 8912396 html
  • Python 字符串的常用方法

    视频版教程 Python3零基础7天入门实战视频教程 下标索引操作和前面的列表 元组用法一样 虽然字符串不能被修改 但是返回一个操作过的新字符串 所以方法还不少 我先学习下常用方法 1 index 元素 方法 查找字符串中指定元素的下标 不
  • Java语言 设计一个动物声音“模拟器”(用接口实现)

    设计一个动物声音 模拟器 希望模拟器可以模拟许多动物的叫声 要求如下 编写接口Animal Animal接口有两个抽象方法cry 和getAnimalName 即要求实现该接口的各种具体的动物类给出自己的叫声和种类名称 编写模拟器类Simu
  • BOX2D 第十章 世界类

    第十章 世界类 Dec 2nd 2012 Comments 声明 此文章翻译自Box2D v2 2 0用户手册 仅供学习参考 关于 About b2World类包含了物体和连接器 它管理了模拟相关的所有方面并且允许异步需求 像AABB需求和
  • kakfa 常见错误(长期更新 2023.09.05)

    kafka版本 2 13 3 40 一 消费者相关 1 1 消费组 1 1 1 查看消费组命令找不到消费组 1 2 消费者 1 2 1 This error handler cannot process org apache kafka c
  • VGGNet网络结构学习

    前言 VGG是Oxford的Visual Geometry Group的组提出的 大家应该能看出VGG名字的由来了 该网络是在ILSVRC 2014上的相关工作 主要工作是证明了增加网络的深度能够在一定程度上影响网络最终的性能 VGG有两种
  • 查看OpenStack的版本

    show openstack version root localhost openstack version openstack 4 0 2 Using openstack version will only give you the v
  • Linux中如何快速查找并执行之前执行过的命令

    history grep 命令 history 显示的记录行号 回车执行 Ctrl R 输入若干字符 关键词 会搜索包含所输入关键词的历史命令 继续按Ctrl R则会继续向前搜索包含关键词的历史命令 找到目标命令后 可以直接按enter键执
  • windows中将sqlmap添加到环境变量中

    在windows下每次使用sqlmap进行sql注入测试时 都要先进到sqlmap py的目录中 然后执行python sqlmap py url 而作为未来的渗透大佬 怎么能够允许这么low的事情出现 1 添加环境变量 电脑右键属性 高级
  • IDEA 自定义注解(类注释、方法注释)

    文章目录 一 生成类注释 1 打开设置位置 2 将自定义的类注解规则 复制到Class中 3 使用 新建类的时候会自动加上注解 二 自定义方法注解 1 打开设置 2 添加自定义注解模板组 3 添加自定义注解模板 4 设置模板的作用范围 5
  • Python Flask 建站框架入门课程-微课学习-第三章 进阶

    上传文件 用 Flask 处理文件上传很简单 只要确保你没忘记在 HTML 表单中设置 enctype multipart form data 属性 不然你的浏览器根本不会发送文件 已上传的文件存储在内存或是文件系统中一个临时的位置 你可以