Learn Python 3 :Flask Web开发小记

最近看了Flask Web开发:基于Python的Web应用开发实战,书中详细介绍了Web程序的开发、测试、部署过程,值得一读!我在书中例子的基础上做了些更改,实现了一个简单的个人博客:NiceBlog,仅作为个人学习,还有许多不足的地方待完善,这里做一些简单的记录,方便以后查阅,代码放在了Github上:https://github.com/SheHuan/NiceBlog。

一、功能

1、对于普通用户,主要有如下功能:

  • 注册、登录、重置密码(邮箱验证)
  • 文章列表、详情
  • 评论
  • 喜欢

2、对于管理员,除了有普通用户的功能,主要有如下功能:

  • 写文章(Markdown编辑)
  • 用户权限管理(管理喜欢、评论的权限)
  • 评论管理(删除、屏蔽)

3、为移动端提供相关api接口

二、项目结构

遵循了书中多文件Flask程序的基本结构,下边是NiceBlog的项目结构:
|-NiceBlog
   |-app/ 主目录
      |-api/ 为移动端提供接口的蓝本
      |-auth/ 权限认证的蓝本
      |-main/ 主体功能的蓝本
      |-manage/ 管理相关功能的蓝本
      |-static/ 静态资源目录(icon、js、css)
      |-templates/ html模板目录
      |-__init__.py 初始化项目的工厂函数
      |-decorators.py 自定义的装饰器
      |-email.py 发送邮件功能
      |-excepitions.py 自定义异常处理
      |-models.py 数据模型
   |-migrations/ 数据库迁移脚本目录
   |-nb_env/ 虚拟环境
   |-tests/ 单元测试目录
   |-config.py 配置文件
   |-manage.py 启动程序以及其他的程序任务
   |-requirements.txt 项目的依赖包列表

三、实现

1、工厂函数

一个简单的Flask Web程序可以写在单文件中,test.py

app = Flask(__name__)

# 定义的路由
@app.route('/')
def index():
    return '

Hello World!

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

但是执行程序时,由于在全局作用域创建导致无法动态修改配置,也导致了单元测试时无法在不同配置环境运行程序。所以可以把程序的创建转移到可显示调用的工厂函数中,也就是前边项目结构中的__init__.py,在工厂函数中导入需要的Flask扩展:

def create_app(config_name):
    app = Flask(__name__)
    # 导致指定的配置对象
    app.config.from_object(config[config_name])
    # 调用config.py的init_app()
    config[config_name].init_app(app)

    # 初始化扩展
    bootstrap.init_app(app)
    mail.init_app(app)
    moment.init_app(app)
    db.init_app(app)
    login_manager.init_app(app)
    pagedown.init_app(app)
    return app

2、蓝本

新的问题来了,使用工厂函数后,程序在运行时创建,而不是在全局作用域,必须等到执行create_app()后才能使用@app.route()装饰器,这时就要使用蓝本了,在蓝本中也可以定义路由,但是定义的路由处于休眠状态直到蓝本注册到程序后在成为程序一部分,例如main蓝本的目录结构如下:
|-NiceBlog
   |-app/ 主目录
      |-main/ 主体功能的蓝本
         |-__init__.py 创建蓝本
         |-errors.py 蓝本的错误处理
         |-forms.py 蓝本的表单
         |-views.py 蓝本的路由

首先看一下__init__.py

# 两个参数分别指定蓝本的名字、蓝本所在的包或模块(使用 __name__即可)
main = Blueprint('main', __name__)
# 导入路由模块、错误处理模块,将其和蓝本关联起来
# 在蓝本的末尾导入在两个模块里还要导入蓝本,防止循环导入依赖
from app.main import views, errors
2.1、表单

forms.py是当前蓝本中的表单,项目中使用了FlaskForm,可以方便的完成表单校验,例如创建、编辑文章的表单:

class BlogForm(FlaskForm):
    title = StringField('请输入文章标题', validators=[DataRequired(), Length(1, 128)])
    labels = StringField('文章标签(标签之间用空格隔开)', validators=[DataRequired()])
    summary = TextAreaField('文章概要', validators=[DataRequired()])
    content = TextAreaField('文章内容', validators=[DataRequired()])
    preview = TextAreaField('文章预览', validators=[DataRequired()])
    publish = SubmitField('发布')
    save = SubmitField('保存')
2.2、路由

views.py就是在蓝本中定义的路由,例如主页的路由:

@main.route('/create-blog', methods=['GET', 'POST'])
@admin_required
def create_blog():
    """
    写新文章
    """
    form = BlogForm()
    if form.validate_on_submit():
        blog = None
        if form.publish.data:
            # 发布
        elif form.save.data:
            # 保存草稿
        return redirect(url_for('main.index'))
    return render_template('markdown_editor.html', form=form, type='create')

注意装饰器为当前蓝本的名字main,而不是之前的appcreate_blog()称为视图函数,一个路由保存了URL到视图函数的映射关系。redirect(url_for('main.index'))代表重定向到主页,url_for()的参数为要跳转到的URL对应的视图函数名,但需要加上视图函数所在的蓝本名,即main.indexrender_template()是Flask提供的函数,把Jinja2模板引擎集成到了程序中,第一个参数是模板名称对应一个html文件,即执行该视图函数后最终要渲染的页面,后边的参数为传递给模板的参数。

2.3、错误处理

errors.py是蓝本中的错误处理程序,例如:

@main.app_errorhandler(404)
def page_not_found(e):
    if request.url.find('api') != -1:
        return jsonify({'error': '请求的资源不存在', 'code': '404', 'data': ''})
    return render_template('error/404.html'), 404

如果使用@main.errorhandler装饰器只有当前蓝本的错误才能触发,为了使其它错误也能触发所以使用了@main.app_errorhandler装饰器

2.4、注册蓝本

其它蓝本的定义也类似,最后需要在工厂函数中重注册蓝本,例如:

def create_app(config_name):
    # ......
    # 注册main蓝本
    from app.main import main as main_blueprint
    app.register_blueprint(main_blueprint)

    # 注册auth蓝本
    from app.auth import auth as auth_blueprint
    # 使用url_prefix注册后,蓝本中定义的所有路由都会加上指定前缀,/login --> /auth/login
    app.register_blueprint(auth_blueprint, url_prefix='/auth')

    return app

3、前端

3.1、Jinja2

Flask使用Jinja2作为模板引擎,模板是一个包含响应文本的HTML文件,其中包含只有在请求的上下文才知道的动态占位变量。默认情况下,模板保存在templates目录。

Jinja2模板中{{ 变量名 }}代表一个变量(注意变量名两边有一个空格,可以识别任意类型的变量),从渲染模板时使用的数据中获取。如果变量的值是HTML,由于转义的原因导致浏览器不能正常显示HTML代码,所以需要使用safe过滤器,例如文章详情的HTML显示就需要这样处理,过滤器写在变量名后用竖线隔开{{ 变量名|过滤器名 }}

Jinja2中用{% 控制语句 %}代表控制结构来改变模板的渲染流程,例如:

# 条件控制
{% if xxx %}
    

Android

{% else %}

iOS

{% endif %}
# for循环
{% for x in xs %}
    
  • {{ x }}
  • {% endfor %}
    # 导入
    {% import 'xxx.html' %}
    
    # 包含
    {% include 'xxx.html' %}
    

    导入、包含的目的都是为了复用,还可以通过继承实现复用,类似于类的继承:

    # 继承
    {% extends "base.html" %}
    

    通过继承,模板中重复的代码都可以写在父模板里,例如导航条和页面底部footer就可以放在父模板里。

    3.2、Bootstrap

    前端使用了Bootstrap框架,它提供了良好的CSS规范,可以帮助我们更好的美化界面,具体的可参考:
    https://v3.bootcss.com/,要在项目中集成它可以使用Flask的Flask-Bootstrap扩展,直接在PyCharm安装,并在工厂函数中初始化,还要让项目的父模板继承Bootstrap的基类模板:

    # common_base.html
    {% extends "bootstrap/base.html" %}
    

    Bootstrap的基类模板base.html提供了一个网页框架,包含了Bootstrap中的所有CSS和JS文件。除此之外基类模板还定义了许多可在其子类模板中重定义的块,使用格式如下:

    {% block 块名称 %}
    {% endblock %}
    

    常用的块如下:

    块名称 含义
    head 标签中的内容
    title 标签中的内容</td> </tr> <tr> <td>body</td> <td><body>标签中的内容</td> </tr> <tr> <td>styles</td> <td>css样式单的定义</td> </tr> <tr> <td>navbar</td> <td>自定义的导航条</td> </tr> <tr> <td>content</td> <td>自定义的页面内容</td> </tr> <tr> <td>page_content</td> <td>定义content在内部</td> </tr> <tr> <td>scripts</td> <td>JS声明,一般在模板尾部</td> </tr> </tbody> </table> <p>注意如在子模板在模板已有的块中添加新内容,需要使用<code>super()</code>函数:</p> <pre><code>{% block scripts %} {{ super() }} <!-- 新加的内容 --> {% endblock %} </code></pre> <h5>3.3、Flask-WTF</h5> <p>在<strong>2.1</strong>中我们已经看到了用<code>Flask-WTF</code>定义表单的方式,即自定义的表单类继承<code>FlaskForm</code>类,并添加需要的类变量,<code>Flask-WTF</code>定义了许多标准字段可以被渲染成指定的表单类HTML标签,例如:</p> <table> <thead> <tr> <th>字段名</th> <th>对应的H5标签</th> </tr> </thead> <tbody> <tr> <td>StringField</td> <td>文本框</td> </tr> <tr> <td>TextAreaField</td> <td>多行文本框</td> </tr> <tr> <td>PasswordField</td> <td>密码输入框</td> </tr> <tr> <td>BooleanField</td> <td>复选框</td> </tr> <tr> <td>SubmitField</td> <td>表单提交按钮</td> </tr> </tbody> </table> <p>同时<code>Flask-WTF</code>还提供了许多常用的表单校验函数,例如:<code>Email()</code>、<code>EqualTo()</code>、<code>DataRequired()</code>、<code>Length()</code>等等,当点击提交按钮时,会自动校验表单是否满足预定义的条件。</p> <p>在<strong>2.2</strong>中,我们通过参数把表单类的实例同步<code>form</code>参数传入模板:</p> <pre><code>render_template('markdown_editor.html', form=form, type='create') </code></pre> <p>在模板中可以通过如下方式生表单(只保留了部分核心代码):</p> <pre><code class="html"><form method="post" role="form" class="height-full"> {{ form.hidden_tag() }} {{ form.title(id="title", class="form-control editor-blog-title", placeholder=form.title.label.text) }} {{ form.labels(class="form-control editor-blog-area", placeholder=form.labels.label.text) }} {{ form.summary(class="form-control editor-blog-area", placeholder=form.summary.label.text, rows=3) }} {{ form.publish(class="btn btn-info") }} {{ form.save(class="btn btn-success") }} </form> </code></pre> <p>这样的好处是我们能自定义表单的样式等等,但是工作量蛮大的,如果对表单样式没有特殊的需求,Bootstrap中的表单样式可以满足需求,可以通过<code>Flask-Bootstrap</code>提供的辅助函数快速的渲染表单,只需要如下两步:</p> <pre><code class="html">{% import "bootstrap/wtf.html" as wtf %} {{ wtf.quick_form(form) }} </code></pre> <p>例如登录的H5模板就是这样做的。<br> <code>form.hidden_tag()</code> 模板参数将被替换为一个隐藏字段,用来实现在配置中激活的 <strong>CSRF</strong> 保护。如果你已经激活了CSRF,这个字段需要出现在你所有的表单中。</p> <p>在<strong>2.2</strong>中,如果点击表单提交按钮,所有的表单都能成功通过校验,则<code>form.validate_on_submit()</code>的值为<code>True</code>,否则校验失败,网页会出现对应提示。如果有两个提交按钮,那么在校验成功后,还需要判断点击的是哪个按钮,否则所有的按钮都执行了同一个操作。例如我们的文章发布和保存按钮,当表单类中的按钮字段的<code>data</code>属性为<code>True</code>则代表该按钮被点击,例如:</p> <pre><code class="python">if form.publish.data: # 发布 elif form.save.data: # 保存草稿 </code></pre> <h5>3.4、jQuery</h5> <p>有些页面需要在相关操作后修改控件的CSS样式,例如文章详情的<strong>喜欢</strong>和<strong>取消喜欢</strong>按钮,最简单的方式是操作成功后直接刷新整个页面,但这样体验并不好,更好的方式是局部刷新。这里直接使用jQuery(Bootstrap也提供了类似的操作,同时包含了jQuery,不需要单独导入jQuery)来实现。使用<code>jQuery</code>强大的选择器功能可以方便的得到要操作的<code>DOM节点</code>,按钮的点击也是发起一个请求,<code>jQuery</code>也集成了<code>ajax</code>,可以方便的处理请求,在请求完成后根据响应结果来更改<code>DOM节点</code>的样式。看下按钮的点击事件:</p> <pre><code>favourite = function (id) { if ($('.blog-favourite-btn').length > 0) {//取消喜欢 $.get('/manage/blog/cancel_favourite', { id: id }).done(function (data) { $('.blog-favourite-btn span').removeClass('glyphicon-heart').addClass('glyphicon-heart-empty'); $('.blog-favourite-btn').removeClass('blog-favourite-btn').addClass('blog-unfavourite-btn'); }) } else if ($('.blog-unfavourite-btn').length > 0) {//喜欢 $.get('/manage/blog/favourite', { id: id }).done(function (data) { if ('200' === data) { $('.blog-unfavourite-btn span').removeClass('glyphicon-heart-empty').addClass('glyphicon-heart'); $('.blog-unfavourite-btn').removeClass('blog-unfavourite-btn').addClass('blog-favourite-btn'); } if ('403' === data) { alert('没有操作权限'); } }) } } </code></pre> <h4>4、Markdown</h4> <p>书中使用的是<code>Flask-PageDown</code>、<code>Markdown</code>两个库来实现对<strong>Markdown</strong>功能的支持,但是不够理想,有些Markdown语法并不能很好的支持,例如<code>Flask-PageDown</code>实时预览时并不支持代码块和表格等。最后使用了marked这个库,它是一个全功能的Markdown解析器和编译器,用JavaScript编写,构建速度快,其实就是实时将用Markdown语法编辑的内容转换成对应的HTML预览,但是没有CSS样式的HTML还是有点丑,github-markdown-css是一个不错的选择,可以帮助我们实现github风格的Markdwon预览。既然是要编辑文章那么直接使用HTML里的<code><textarea></code>肯定难以实现理想的效果,这里使用了ace,它是一个用JavaScript编写的独立代码编辑器,下载<code>ace-builds/arc-min</code>即可。核心的帮助工具就这些了,接下来就是把他们组合起来,首先看HTML界面主要有编辑和预览两部分:</p> <pre><code><!--编辑--> <div class="col-md-6 markdown-panel"> <div id="markdown-edit"></div> </div> <!--预览--> <div class="col-md-6 markdown-panel"> <div id="markdown-preview" class="markdown-body"></div> </div> </code></pre> <p>接下来就是编辑器的初始化了:</p> <pre><code><script> //编辑器配置 var ace_edit = ace.edit('markdown-edit'); ace_edit.setTheme('ace/theme/chrome'); ace_edit.getSession().setMode('ace/mode/markdown'); ace_edit.renderer.setShowPrintMargin(false); //字体大小 ace_edit.setFontSize(15); //自动换行 ace_edit.setOption('wrap', 'free'); $("#markdown-edit").keyup(function () { // 实现Markdown到HTML的预览 $("#preview").text(marked(ace_edit.getValue())); }); </script> </code></pre> <p>更多细节可参考markdown_editor.html,看一下效果:<br> </p> <div class="image-package"> <div class="image-container" style="max-width: 700px; max-height: 373px;"> <div class="image-view"> <a href="http://img.e-com-net.com/image/info10/fc71a2d1589b4b10af2386c8a2191672.jpg" target="_blank"><img src="http://img.e-com-net.com/image/info10/fc71a2d1589b4b10af2386c8a2191672.jpg" width="650" height="347" alt="Learn Python 3 :Flask Web开发小记_第1张图片" style="border:1px solid black;"></a> </div> </div> <div class="image-caption"> Markdwon </div> </div> <p></p> <h4>5、数据库</h4> <p>数据库使用的是<code>MySql</code>,同时使用了<code>ORM</code>框架<code>SQLAlchemy</code>把关系数据库的表结构映射到对象上,来简化数据库的操作,Flask有一个<code>Flask-SQLAlchemy</code>扩展可以方便的在程序中使用<code>SQLAlchemy</code>,首先需要指定数据库URL,这一步在<code>config.py</code>完成:</p> <pre><code>SQLALCHEMY_DATABASE_URI = 'mysql+pymysql://root:123456@127.0.0.1:3306/niceblog_dev' </code></pre> <p>然后在工厂函数完成配置。之后就是定义数据模型了,项目中一共定义了6个数据模型:<code>User</code>、<code>Role</code>、<code>Blog</code>、<code>Comment</code>、<code>Favourite</code>、<code>Label</code>,都继承<code>db.Model</code>,在数据模型中指定表名称、列名称等信息,例如保存文章信息的<code>Blog</code>:</p> <pre><code class="python">class Blog(db.Model): """ 博客数据Model """ __tablename__ = 'blogs' id = db.Column(db.Integer, primary_key=True) title = db.Column(db.String(128)) summary = db.Column(db.Text) content = db.Column(db.Text) content_html = db.Column(db.Text) # 发布日期 publish_date = db.Column(db.DateTime, index=True) # 最后的编辑日期 edit_date = db.Column(db.DateTime, index=True) # 外键,和User表对应 user_id = db.Column(db.Integer, db.ForeignKey('users.id')) # 是否是草稿 draft = db.Column(db.Boolean) # 是否禁用评论 disable_comment = db.Column(db.Boolean, default=False) # 被浏览的次数 views = db.Column(db.Integer, default=0) comments = db.relationship('Comment', backref='blog', lazy='dynamic') favourites = db.relationship('Favourite', backref='blog', lazy='dynamic') </code></pre> <p>配置好了数据库、定义好了数据模型,就可以通过如下命令来操作数据库了:</p> <ul> <li> <code>db.create_all()</code>:创建表</li> <li> <code>db.session.add()</code>:插入行、修改行,最后需要执行<code>db.session.commit()</code> </li> <li> <code>db.session.delete()</code>:删除行,最后需要执行<code>db.session.commit()</code> </li> <li> <code>数据模型名.query().查询过滤器.查询执行函数</code>:查询行</li> </ul> <p>常用的查询过滤器有:<code>filter()</code>、<code>filter_by()</code>、<code>limit</code>、<code>offset()</code>、<code>order_by()</code>、<code>group_by()</code><br> 常用的查询执行函数有:<code>all()</code>、<code>first()</code>、<code>first_or_404()</code>、<code>get()</code>、<code>get_or_404()</code>、<code>count()</code>、<code>paginate()</code></p> <p>如果在shell中操作数据库,每次都要导入数据库实例和数据模型,如何避免这个问题呢?由于项目使用了<code>Flask-Script</code>命令行解释器,支持自定义命令,可以让<code>Flask-Script</code>的shell命令自动导入特定对象即可:</p> <pre><code class="python">def make_shell_context(): return dict(app=app, db=db, User=User, Role=Role, Blog=Blog, Comment=Comment, Favourite=Favourite, Label=Label, Permission=Permission) manager.add_command('shell', Shell(make_context=make_shell_context)) </code></pre> <p>开发中修改数据模型是不可避免的,为了不发生删表重建导致数据丢失的问题,我们需要使用<code>数据库迁移框架</code>,增量式的把数据模型的改变应用到数据库中,我们可以直接使用<code>Flask-Migrate</code>来完成,在<code>Flask-Script</code>集成数据库迁移功能:</p> <pre><code class="python">migrate = Migrate(app, db) manager.add_command('db', MigrateCommand) </code></pre> <p>数据库迁移只要有如下三个命令:</p> <ol> <li> <code>python manage.py db init</code>:创建迁移仓库,初始执行一次即可</li> <li> <code>python manage.py db migrate --message "initial migration"</code>:创建迁移脚本</li> <li> <code>python manage.py db upgrade</code>:更新数据库</li> </ol> <p>每次修改数据模型后需要更新数据库时执行命令2、3即可。</p> <h4>6、接口开发</h4> <p>api蓝本的目录结构如下:<br> <strong>|-NiceBlog</strong><br> <strong>   |-app/</strong> 主目录<br> <strong>      |-api/</strong> 为移动端提供接口的蓝本<br> <strong>         |-__init__.py</strong> 创建蓝本<br> <strong>         |-authentication.py</strong> 登录、注册、token检验<br> <strong>         |-blogs.py</strong> 文章列表、详情的接口<br> <strong>         |-comments.py</strong> 评论相关接口<br> <strong>         |-decorators.py</strong> 自定义装饰器<br> <strong>         |-favourites.py</strong> 喜欢操作相关的接口<br> <strong>         |-labels.py</strong> 文章分类标签接口<br> <strong>         |-responses.py</strong> 帮助返回JSON数据</p> <p><strong>Flask</strong>提供的<code>jsonify()</code>函数可以方便的把一个字典转换成JSON串返,例如返回文章分类标签的路由可以这么写:</p> <pre><code class="python">@api.route('/labels/') def get_labels(): labels = Label.query.all() data = {'labels': [label.to_json() for label in labels]} return jsonify({'error': '', 'code': '200', 'data': data}) </code></pre> <p><code>to_json()</code>方法是数据模型中<code>Label</code>类的方法,完成数据模型到JSON格式化的序列化字典转换:</p> <pre><code class="python"> def to_json(self): json_label = { 'id': self.id, 'name': self.name, } return json_label </code></pre> <p>为了保证接口有一定的安全性,不被随意访问,除了登录、注册、以及文章预览的html页面外其他接口都需要一个<strong>token</strong>参数,token可以在登录后得到,token过期后需要重新请求。由于要对请求携带的token参数校验,可以定义一个<code>before_request</code>钩子,在每次请求前统一完成token的校验:</p> <pre><code>@api.before_request def before_request(): url = request.url if url.find('login') == -1 and url.find('register') == -1 and url.find('preview') == -1: token = request.args.get('token') if token is None: return unauthorized('token缺失') user = User.verify_auth_token(token) if user is None: return forbidden('token过期,请重新登录') else: # g是程序上下文,用作临时存储对象, # 保存当前的请求对应的user,每次请求都会更新 g.current_user = user </code></pre> <p>测试接口可以使用<strong>HTTPie</strong>,通过<strong>PyCharm</strong>在虚拟环境安装HTTPie后,启动Web服务,windows下通过cmd进入虚拟环境目录,执行<code>Scripts\activate</code>激活虚拟环境(退出虚拟环境执行<code>deactivate</code>):<br> </p> <div class="image-package"> <div class="image-container" style="max-width: 221px; max-height: 33px;"> <div class="image-view"> <a href="http://img.e-com-net.com/image/info10/dfd77d15131d4706924b829a4605e60d.png" target="_blank"><img src="http://img.e-com-net.com/image/info10/dfd77d15131d4706924b829a4605e60d.png" width="221" height="33"></a> </div> </div> <div class="image-caption"> 激活虚拟环境 </div> </div> <br> 执行登录请求,命令如下: <p></p> <pre><code>http POST http://127.0.0.1:5000/api/login/ email==shehuan320@163.com password==123456 </code></pre> <p>响应如下:</p> <br> <div class="image-package"> <div class="image-container" style="max-width: 644px; max-height: 354px;"> <div class="image-view"> <a href="http://img.e-com-net.com/image/info10/e5f62791120e43c48e753261737d3be2.png" target="_blank"><img src="http://img.e-com-net.com/image/info10/e5f62791120e43c48e753261737d3be2.png" width="644" height="354" alt="Learn Python 3 :Flask Web开发小记_第2张图片" style="border:1px solid black;"></a> </div> </div> <div class="image-caption"> 登录 </div> </div> <p>使用登录的得到的token请求文章分类标签接口:</p> <pre><code>http GET http://127.0.0.1:5000/api/labels/ token==eyJhbGciOiJIUzI1NiIsImlhdCI6MTUxODEzOTQwNiwiZXhwIjoxNTE4NzQ0MjA2fQ.eyJpZCI6MX0.EujL1Pb4lg20Bb2QWngop1N79os0LdFWniA8bL4JQHo </code></pre> <p>响应如下:</p> <br> <div class="image-package"> <div class="image-container" style="max-width: 644px; max-height: 596px;"> <div class="image-view"> <a href="http://img.e-com-net.com/image/info10/cbd13cc0d451431c962dbeb2c4f8424b.png" target="_blank"><img src="http://img.e-com-net.com/image/info10/cbd13cc0d451431c962dbeb2c4f8424b.png" width="644" height="596" alt="Learn Python 3 :Flask Web开发小记_第3张图片" style="border:1px solid black;"></a> </div> </div> <div class="image-caption"> 文章分类标签 </div> </div> <h3>四、安装</h3> <p>以下的安装步骤是基于Windows环境的!</p> <ol> <li>从Guthub clone NiceBlog到本地</li> <li>安装Python 3 的开发环境</li> <li>安装PyCharm开发工具,导入项目,建议使用虚拟环境,可直接在 PyCharm 中创建一个虚拟环境,或者使用命令行创建。</li> <li>在虚拟环境中安装<code>requestments.txt</code>中的扩展包,直接在 PyCharm 的 Terminal 执行如下命令:<br> <code>pip install -r requirements.txt</code> </li> <li>安装MySql,创建数据库,并在<code>config.py</code>中替换为自己创建的数据名,并修改用户名和密码</li> <li>在 Terminal 执行<code>python manage.py shell</code>切换到 shell 环境,再执行<code>db.create_all()</code>创建数据表</li> <li>由于注册账号使用了qq邮箱验证,请在<code>config.py</code>中替换自己的qq邮箱和授权登录密码,并更改管理员邮箱为自己的邮箱。</li> <li>执行<code>exit()</code>退出 shell 环境,再执行<code>python manage.py runserver</code>就可以启动 Web 服务了,默认运行在<code>http://127.0.0.0.1:5000</code>。</li> <li>在浏览器访问<code>http://127.0.0.0.1:5000</code>,你就可以进行注册账号,创建文章等操作了,希望一切顺利吧!</li> </ol> <p>最后附上几张截图:</p> <table> <thead> <tr> <th> <div class="image-package"> <div class="image-container" style="max-width: 700px; max-height: 594px;"> <div class="image-view"> <a href="http://img.e-com-net.com/image/info10/fa792ed012184aae83d79a1786320c89.jpg" target="_blank"><img src="http://img.e-com-net.com/image/info10/fa792ed012184aae83d79a1786320c89.jpg" width="650" height="552" alt="Learn Python 3 :Flask Web开发小记_第4张图片" style="border:1px solid black;"></a> </div> </div> <div class="image-caption"></div> </div></th> <th> <div class="image-package"> <div class="image-container" style="max-width: 700px; max-height: 633px;"> <div class="image-view"> <a href="http://img.e-com-net.com/image/info10/c48bc874a535450a92a386f7f904aa62.jpg" target="_blank"><img src="http://img.e-com-net.com/image/info10/c48bc874a535450a92a386f7f904aa62.jpg" width="650" height="589" alt="Learn Python 3 :Flask Web开发小记_第5张图片" style="border:1px solid black;"></a> </div> </div> <div class="image-caption"></div> </div></th> </tr> </thead> <tbody> <tr> <td> <div class="image-package"> <div class="image-container" style="max-width: 700px; max-height: 535px;"> <div class="image-view"> <a href="http://img.e-com-net.com/image/info10/1f2ec5e65b4d4f1a940538117fe5d914.jpg" target="_blank"><img src="http://img.e-com-net.com/image/info10/1f2ec5e65b4d4f1a940538117fe5d914.jpg" width="650" height="497" alt="Learn Python 3 :Flask Web开发小记_第6张图片" style="border:1px solid black;"></a> </div> </div> <div class="image-caption"></div> </div></td> <td> <div class="image-package"> <div class="image-container" style="max-width: 700px; max-height: 354px;"> <div class="image-view"> <a href="http://img.e-com-net.com/image/info10/3c551fca6cea490a8f587e856ed63afc.jpg" target="_blank"><img src="http://img.e-com-net.com/image/info10/3c551fca6cea490a8f587e856ed63afc.jpg" width="650" height="194" alt="Learn Python 3 :Flask Web开发小记_第7张图片" style="border:1px solid black;"></a> </div> </div> <div class="image-caption"></div> </div></td> </tr> </tbody> </table> </article> </div> </div> </div> <!--PC和WAP自适应版--> <div id="SOHUCS" sid="1242911823531986944"></div> <script type="text/javascript" src="/views/front/js/chanyan.js"></script> <!-- 文章页-底部 动态广告位 --> <div class="youdao-fixed-ad" id="detail_ad_bottom"></div> </div> <div class="col-md-3"> <div class="row" id="ad"> <!-- 文章页-右侧1 动态广告位 --> <div id="right-1" class="col-lg-12 col-md-12 col-sm-4 col-xs-4 ad"> <div class="youdao-fixed-ad" id="detail_ad_1"> </div> </div> <!-- 文章页-右侧2 动态广告位 --> <div id="right-2" class="col-lg-12 col-md-12 col-sm-4 col-xs-4 ad"> <div class="youdao-fixed-ad" id="detail_ad_2"></div> </div> <!-- 文章页-右侧3 动态广告位 --> <div id="right-3" class="col-lg-12 col-md-12 col-sm-4 col-xs-4 ad"> <div class="youdao-fixed-ad" id="detail_ad_3"></div> </div> </div> </div> </div> </div> </div> <div class="container"> <h4 class="pt20 mb15 mt0 border-top">你可能感兴趣的:(Learn Python 3 :Flask Web开发小记)</h4> <div id="paradigm-article-related"> <div class="recommend-post mb30"> <ul class="widget-links"> <li><a href="/article/1892586387400617984.htm" title="anaconda中的python在pycharm中用不了_Pycharm中使用Anaconda" target="_blank">anaconda中的python在pycharm中用不了_Pycharm中使用Anaconda</a> <span class="text-muted">白白前</span> <div>Pycharm中使用Anaconda问题:安装完Pycharm和Anaconda后,想让Pycharm能调用Anaconda中包含的各种包。这样就不用重复安装各种包了。Anaconda下载安装Anaconda指的是一个开源的Python发行版本,其包含了conda、Python等180多个科学包及其依赖项。因为包含了大量的科学包,Anaconda的下载文件比较大(约515MB)。安装Anacond</div> </li> <li><a href="/article/1892585122964762624.htm" title="python - 永久存储" target="_blank">python - 永久存储</a> <span class="text-muted">susie0815</span> <a class="tag" taget="_blank" href="/search/python/1.htm">python</a><a class="tag" taget="_blank" href="/search/python/1.htm">python</a><a class="tag" taget="_blank" href="/search/%E6%9C%8D%E5%8A%A1%E5%99%A8/1.htm">服务器</a> <div>打开文件使用open()函数打开文件时,openfilemode(文件打开模式)是一个决定了以何种方式打开文件以及对文件可以进行哪些操作的重要参数。基本模式只读模式(‘r’)默认的打开模式,用于读取文件。如果文件不存在,会抛出FileNotFoundError异常。try:file=open('test.txt','r')content=file.read()print(content)file.</div> </li> <li><a href="/article/1892585123644239872.htm" title="使用分布式锁解决淘客返利系统中的并发问题" target="_blank">使用分布式锁解决淘客返利系统中的并发问题</a> <span class="text-muted">微赚淘客系统开发者@聚娃科技</span> <a class="tag" taget="_blank" href="/search/%E5%88%86%E5%B8%83%E5%BC%8F/1.htm">分布式</a> <div>使用分布式锁解决淘客返利系统中的并发问题大家好,我是微赚淘客系统3.0的小编,是个冬天不穿秋裤,天冷也要风度的程序猿!1.引言在淘客返利系统中,常常需要处理高并发的订单和返利计算。由于并发请求可能会导致数据不一致的问题,因此需要一种有效的解决方案来管理并发访问。分布式锁是一种常见的并发控制机制,可以确保在同一时刻只有一个请求对共享资源进行修改。本文将详细介绍如何在Java中使用分布式锁解决淘客返利</div> </li> <li><a href="/article/1892584114469531648.htm" title="B - N! HDU - 1042" target="_blank">B - N! HDU - 1042</a> <span class="text-muted">Ws_</span> <a class="tag" taget="_blank" href="/search/c%2B%2B/1.htm">c++</a><a class="tag" taget="_blank" href="/search/%E7%AE%97%E6%B3%95/1.htm">算法</a><a class="tag" taget="_blank" href="/search/%E5%BC%80%E5%8F%91%E8%AF%AD%E8%A8%80/1.htm">开发语言</a> <div>GivenanintegerN(0≤N≤10000),yourtaskistocalculateN!InputOneNinoneline,processtotheendoffile.OutputForeachN,outputN!inoneline.SampleInputcopyOutputcopy123126翻译:这个问题是计算给定整数N的阶乘N!,其中0≤N≤10000。阶乘的定义是从1到N的所</div> </li> <li><a href="/article/1892584115232894976.htm" title="自动化测试的学习路线" target="_blank">自动化测试的学习路线</a> <span class="text-muted">Ws_</span> <a class="tag" taget="_blank" href="/search/%E5%AD%A6%E4%B9%A0/1.htm">学习</a> <div>自动化测试是提高软件开发效率和质量的关键手段。学习自动化测试通常涉及多个方面的技能,从基础的编程语言知识到测试工具的使用,再到实际的测试脚本编写和执行。以下是一个学习自动化测试的路线图,帮助你有条不紊地掌握相关技能:1.基础知识在开始自动化测试之前,首先要具备一定的编程和软件测试基础:编程语言:Python、Java、JavaScript或者Ruby(根据你选择的自动化测试工具决定)软件测试基础:</div> </li> <li><a href="/article/1892584115706851328.htm" title="Python自动化测试" target="_blank">Python自动化测试</a> <span class="text-muted">Ws_</span> <a class="tag" taget="_blank" href="/search/python/1.htm">python</a><a class="tag" taget="_blank" href="/search/python/1.htm">python</a> <div>Python自动化测试是软件开发中的重要组成部分,可以帮助提高测试效率和准确性。以下是学习Python自动化测试的基本路线,以及相关资料的链接:学习路线1.基础知识Python基础:掌握Python语言的基本语法、数据类型、控制流、函数、面向对象编程等。你可以先确保对Python的基本语法有清晰的理解。参考资料:Python官方文档书籍推荐:《Python编程:从入门到实践》2.了解自动化测试的基</div> </li> <li><a href="/article/1892582980182929408.htm" title="Python实现Excel表格保存到不同文件夹" target="_blank">Python实现Excel表格保存到不同文件夹</a> <span class="text-muted">Leo_Aqu</span> <a class="tag" taget="_blank" href="/search/excel/1.htm">excel</a><a class="tag" taget="_blank" href="/search/python/1.htm">python</a> <div>"""点击“上传”按钮,从本地上传待处理的Excel表格点击“处理”按钮,对Excel表格进行处理点击“保存A”按钮,保存处理后的Excel表格到A文件夹下点击“保存B”按钮,保存处理后的Excel表格到B文件夹下"""#作者:Leo#时间:2024/9/2621:52importtkinterastkfromtkinterimportfiledialog,messageboximportpand</div> </li> <li><a href="/article/1892582349875507200.htm" title="通义灵码AI程序员" target="_blank">通义灵码AI程序员</a> <span class="text-muted">天天向上杰</span> <a class="tag" taget="_blank" href="/search/AI%E7%BC%96%E7%A8%8B/1.htm">AI编程</a><a class="tag" taget="_blank" href="/search/AIGC/1.htm">AIGC</a><a class="tag" taget="_blank" href="/search/%E4%BA%BA%E5%B7%A5%E6%99%BA%E8%83%BD/1.htm">人工智能</a> <div>通义灵码是阿里云与通义实验室联合打造的智能编码辅助工具,基于通义大模型技术,为开发者提供多种编程辅助功能。它支持多种编程语言,包括Java、Python、Go、TypeScript、JavaScript、C/C++、PHP、C#、Ruby等200多种编码语言。通义灵码AI程序员:今年1月,通义灵码AI程序员全面上线,同时支持VSCode、JetBrainsIDEs,是国内首个真正落地的AI程序员。</div> </li> <li><a href="/article/1892581971289239552.htm" title="rem、em、vw区别" target="_blank">rem、em、vw区别</a> <span class="text-muted">IT木昜</span> <a class="tag" taget="_blank" href="/search/%E5%A4%A7%E7%99%BD%E8%AF%9D%E5%89%8D%E7%AB%AF%E9%9D%A2%E8%AF%95%E9%A2%98/1.htm">大白话前端面试题</a><a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF/1.htm">前端</a><a class="tag" taget="_blank" href="/search/javascript/1.htm">javascript</a><a class="tag" taget="_blank" href="/search/css/1.htm">css</a> <div>在前端开发里,rem、em、vw都是用来设置元素大小的单位,下面就用大白话讲讲它们的区别。参考标准不一样rem:就像大家都用同一把“大尺子”来量东西,这把“大尺子”就是网页里根元素(也就是标签)的字体大小。不管元素在网页里的哪个位置,只要用rem做单位,它的大小就按照这把“大尺子”来算。比如根元素字体大小是16px,那么1rem就是16px,2rem就是32px。em:每个元素自己有一把“小尺子”</div> </li> <li><a href="/article/1892581717747757056.htm" title="JavaEE进阶知识学习-----定时任务调度Quartz-4" target="_blank">JavaEE进阶知识学习-----定时任务调度Quartz-4</a> <span class="text-muted">四川码匠</span> <a class="tag" taget="_blank" href="/search/Quartz/1.htm">Quartz</a><a class="tag" taget="_blank" href="/search/JAVA%E8%BF%9B%E9%98%B6%E5%AD%A6%E4%B9%A0/1.htm">JAVA进阶学习</a><a class="tag" taget="_blank" href="/search/Quartz/1.htm">Quartz</a><a class="tag" taget="_blank" href="/search/%E4%BB%BB%E5%8A%A1%E8%B0%83%E5%BA%A6/1.htm">任务调度</a> <div>Quartz和SpringMVC,Spring整合1.Quartz依赖的包如下:org.springframeworkspring-context-support${spring.version}org.springframeworkspring-tx${spring.version}org.quartz-schedulerquartz2.2.3使用Quartz配置作业的方式第一种:MethodI</div> </li> <li><a href="/article/1892581718930550784.htm" title="python使用技巧" target="_blank">python使用技巧</a> <span class="text-muted">超超是超超</span> <a class="tag" taget="_blank" href="/search/python/1.htm">python</a> <div>1、耗时装饰器importtimedefdecorate(func):definner():begin=time.time()result=func()end=time.time()print(f'函数{func}耗时{end-begin}')returnresultreturninner2、查看代码运行耗时fromline_profilerimportLineProfilerdefoperati</div> </li> <li><a href="/article/1892581591247548416.htm" title="Anaconda与python和pycharm的安装及其关系" target="_blank">Anaconda与python和pycharm的安装及其关系</a> <span class="text-muted">Daylight..</span> <a class="tag" taget="_blank" href="/search/%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/1.htm">学习笔记</a><a class="tag" taget="_blank" href="/search/pycharm/1.htm">pycharm</a><a class="tag" taget="_blank" href="/search/python/1.htm">python</a><a class="tag" taget="_blank" href="/search/ide/1.htm">ide</a> <div>Anaconda与python和pycharm的安装及其关系一、Anaconda与python和pycharm的关系:1.Anaconda包含python,并且里面含有许多常用的库。(安装了Anaconda就不需要安装python了)2.pycharm是一种IDE(集成开发环境),在其中可以编写Python程序。(工具和语言的关系)。二、如何安装?Anaconda的安装Anaconda官网下载地址</div> </li> <li><a href="/article/1892581462268506112.htm" title="23. AI-概述" target="_blank">23. AI-概述</a> <span class="text-muted">真上帝的左手</span> <a class="tag" taget="_blank" href="/search/23./1.htm">23.</a><a class="tag" taget="_blank" href="/search/AI/1.htm">AI</a><a class="tag" taget="_blank" href="/search/ai/1.htm">ai</a><a class="tag" taget="_blank" href="/search/%E4%BA%BA%E5%B7%A5%E6%99%BA%E8%83%BD/1.htm">人工智能</a> <div>文章目录前言一、AI1.简介2.发展3.应用场景前言AI‌  随着技术的发展,AI正变得越来越强大和普及,其在解决复杂问题和提高人类生活质量方面的潜力日益显现。一、AIAI(ArtificialIntelligence,人工智能)1.简介  AI(ArtificialIntelligence,人工智能)是计算机科学的一个分支,旨在开发智能系统,使其能够执行通常需要人类智能的任务,例如学习、推理、问</div> </li> <li><a href="/article/1892580705813196800.htm" title="【无标题】" target="_blank">【无标题】</a> <span class="text-muted">是懒羊羊吖~</span> <a class="tag" taget="_blank" href="/search/%E7%AC%94%E8%AE%B0/1.htm">笔记</a> <div>一.WED前端应用软件:c/s架构b/s架构web前端:html5css3javascripthtml5:超文本标记语言----超链接,文字,标签标签语法规范:结束-----双标签标签体------可以嵌套inputimg---------单标签属性:定制元素的行为,属性是不通用的,每一个标签存在自身的属性,当属性名等于属性值时,只需要写属性名,不需要写属性值。二.HTML1.样式//文档声明:告</div> </li> <li><a href="/article/1892580453148323840.htm" title="【TOGAF系列】架构开发方法(ADF)第十一章" target="_blank">【TOGAF系列】架构开发方法(ADF)第十一章</a> <span class="text-muted">东临碣石82</span> <a class="tag" taget="_blank" href="/search/%E6%9E%B6%E6%9E%84/1.htm">架构</a> <div>第11章:G阶段:实施治理11.1目标G阶段的目标是:确保实施项目符合目标架构为解决方案和任何实施驱动的架构变更请求执行适当的架构治理功能11.2输入本节定义了阶段G的输入。11.2.1企业外部参考资料架构参考资料(见TOGAF标准——架构内容)11.2.2非架构输入架构工作请求(见TOGAF标准——架构内容)能力评估(见TOGAF标准——架构内容)11.2.3架构输入■企业架构的组织模型(见TO</div> </li> <li><a href="/article/1892579571526594560.htm" title="ImportError: cannot import name ‘Mapping‘ from ‘collections‘" target="_blank">ImportError: cannot import name ‘Mapping‘ from ‘collections‘</a> <span class="text-muted">AI算法网奇</span> <a class="tag" taget="_blank" href="/search/python%E5%9F%BA%E7%A1%80/1.htm">python基础</a><a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF/1.htm">前端</a><a class="tag" taget="_blank" href="/search/javascript/1.htm">javascript</a><a class="tag" taget="_blank" href="/search/%E6%95%B0%E6%8D%AE%E5%BA%93/1.htm">数据库</a> <div>ImportError:cannotimportname'Mapping'from'collections'解决方法:fromcollections.abcimportMapping#正确导入Mappingdefprocess_mapping(data):ifisinstance(data,Mapping):#使用Mapping进行类型检查#处理映射类型的代码pass测试命令:python-c"f</div> </li> <li><a href="/article/1892579443919089664.htm" title="python图形界面化编程GUI(二)常用的组件(Text、Radiobutton、Checkbutton、Canvas)和布局管理器(gird、pack、place)" target="_blank">python图形界面化编程GUI(二)常用的组件(Text、Radiobutton、Checkbutton、Canvas)和布局管理器(gird、pack、place)</a> <span class="text-muted">hwwaizs</span> <a class="tag" taget="_blank" href="/search/python-GUI%E5%9B%BE%E5%BD%A2%E5%8C%96%E7%BC%96%E7%A8%8B/1.htm">python-GUI图形化编程</a><a class="tag" taget="_blank" href="/search/python/1.htm">python</a><a class="tag" taget="_blank" href="/search/%E5%BC%80%E5%8F%91%E8%AF%AD%E8%A8%80/1.htm">开发语言</a> <div>Text文本框Text(多行文本框)的主要用于显示多行文本,还可以显示网页链接,图片,HTML页面,甚至CSS样式表,添加组件等。主要用来显示信息,也常被当做简单的文本处理器、⽂本编辑器或者网页浏览器来使用。IDLE就是Text组件构成的。insert插入的时候可以用INSERT代表当前光标的位置,END代表在结尾的位置,也可以用插入小数的形式,2.3代表第二行第三列后插入。fromtkinter</div> </li> <li><a href="/article/1892578185061658624.htm" title="Go Web 开发基础:从入门到实战" target="_blank">Go Web 开发基础:从入门到实战</a> <span class="text-muted">一小路一</span> <a class="tag" taget="_blank" href="/search/%E6%8E%8C%E6%8F%A1/1.htm">掌握</a><a class="tag" taget="_blank" href="/search/Go/1.htm">Go</a><a class="tag" taget="_blank" href="/search/%E8%AF%AD%E8%A8%80%EF%BC%9A%E7%BC%96%E7%A8%8B%E4%B8%96%E7%95%8C%E7%9A%84%E8%BF%9B%E9%98%B6%E9%92%A5%E5%8C%99/1.htm">语言:编程世界的进阶钥匙</a><a class="tag" taget="_blank" href="/search/golang/1.htm">golang</a><a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF/1.htm">前端</a><a class="tag" taget="_blank" href="/search/%E9%9D%A2%E8%AF%95/1.htm">面试</a><a class="tag" taget="_blank" href="/search/%E5%90%8E%E7%AB%AF/1.htm">后端</a><a class="tag" taget="_blank" href="/search/%E6%9C%8D%E5%8A%A1%E5%99%A8/1.htm">服务器</a> <div>GoWeb开发基础:从入门到实战Go语言因其高效性和简洁性,成为了后端开发的热门选择之一。Go的net/http包提供了强大的Web服务功能,可以帮助我们快速搭建Web应用。本文将带领你从基础开始,逐步了解如何使用Go创建Web服务、处理路由、使用模板引擎、提供静态文件服务,并与数据库进行交互。文章内容包含常见的错误示例和面试题,帮助你更好地理解GoWeb开发。1.使用net/http创建一个简单</div> </li> <li><a href="/article/1892577804894138368.htm" title="基于微信小程序的天气预报平台的设计与实现" target="_blank">基于微信小程序的天气预报平台的设计与实现</a> <span class="text-muted">usp1994</span> <a class="tag" taget="_blank" href="/search/%E5%BE%AE%E4%BF%A1%E5%B0%8F%E7%A8%8B%E5%BA%8F/1.htm">微信小程序</a><a class="tag" taget="_blank" href="/search/%E5%B0%8F%E7%A8%8B%E5%BA%8F/1.htm">小程序</a> <div>基于微信小程序的天气预报平台的设计与实现DesignandImplementationofaWeatherForecastPlatformBasedonWeChatMiniProgram完整下载链接:基于微信小程序的天气预报平台的设计与实现文章目录基于微信小程序的天气预报平台的设计与实现摘要第一章引言1.1研究背景1.2研究目的1.3研究方法1.4论文结构第二章相关技术介绍2.1微信小程序开发2.</div> </li> <li><a href="/article/1892577552724193280.htm" title="【深度解析】最短路径算法:Dijkstra与Floyd-Warshall" target="_blank">【深度解析】最短路径算法:Dijkstra与Floyd-Warshall</a> <span class="text-muted">吴师兄大模型</span> <a class="tag" taget="_blank" href="/search/%E7%AE%97%E6%B3%95/1.htm">算法</a><a class="tag" taget="_blank" href="/search/%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84/1.htm">数据结构</a><a class="tag" taget="_blank" href="/search/python/1.htm">python</a><a class="tag" taget="_blank" href="/search/%E6%9C%80%E7%9F%AD%E8%B7%AF%E5%BE%84%E7%AE%97%E6%B3%95/1.htm">最短路径算法</a><a class="tag" taget="_blank" href="/search/Dijkstra%E7%AE%97%E6%B3%95/1.htm">Dijkstra算法</a><a class="tag" taget="_blank" href="/search/Floyd-Warshall/1.htm">Floyd-Warshall</a><a class="tag" taget="_blank" href="/search/%E5%BC%80%E5%8F%91%E8%AF%AD%E8%A8%80/1.htm">开发语言</a> <div>系列文章目录01-从零开始掌握Python数据结构:提升代码效率的必备技能!02-算法复杂度全解析:时间与空间复杂度优化秘籍03-线性数据结构解密:数组的定义、操作与实际应用04-深入浅出链表:Python实现与应用全面解析05-栈数据结构详解:Python实现与经典应用场景06-深入理解队列数据结构:从定义到Python实现与应用场景07-双端队列(Deque)详解:Python实现与滑动窗口应</div> </li> <li><a href="/article/1892576293225033728.htm" title="141,【1】buuctf web [SUCTF 2019]EasyWeb" target="_blank">141,【1】buuctf web [SUCTF 2019]EasyWeb</a> <span class="text-muted">rzydal</span> <a class="tag" taget="_blank" href="/search/web/1.htm">web</a><a class="tag" taget="_blank" href="/search/%E5%AE%89%E5%85%A8/1.htm">安全</a> <div>进入靶场代码审计18){die('Oneinchlong,oneinchstrong!');}//使用正则表达式检查$hhh是否包含特定字符集(包括一些常见字符和控制字符等),如果包含则终止脚本执行if(preg_match('/[\x00-0-9A-Za-z\'"\`~_&.,|=[\x7F]+/i',$hhh))die('Trysomethingelse!');//获取$hhh中使用到的字符,</div> </li> <li><a href="/article/1892576164925468672.htm" title="c语言迷宫小游戏350行(源码)" target="_blank">c语言迷宫小游戏350行(源码)</a> <span class="text-muted">迷茫&&前行</span> <a class="tag" taget="_blank" href="/search/c%E8%AF%AD%E8%A8%80/1.htm">c语言</a><a class="tag" taget="_blank" href="/search/c%E8%AF%AD%E8%A8%80/1.htm">c语言</a><a class="tag" taget="_blank" href="/search/%E6%B8%B8%E6%88%8F/1.htm">游戏</a> <div>这是一款基于控制台的双模式迷宫冒险游戏。在极限逃脱模式中,玩家需操控角色"A"在三个精心设计的关卡中躲避追踪者"B",通过WASD键在100步限制内抵达终点"@",关卡包含特殊地形和动态敌人机制。无尽挑战模式则采用随机生成的渐进式迷宫,每关迷宫尺寸随等级扩大,玩家需在无限扩展的迷宫中不断挑战。游戏提供可视化操作界面,通过方向键控制移动,支持中途退出功能(o)。两种模式分别提供3个固定关卡和无限递增</div> </li> <li><a href="/article/1892575700838313984.htm" title="CSE 231 Computer Python program" target="_blank">CSE 231 Computer Python program</a> <span class="text-muted"></span> <a class="tag" taget="_blank" href="/search/%E5%90%8E%E7%AB%AF/1.htm">后端</a> <div>CSE231Spring2025ComputerProject#4LearningobjectivesThisassignmentfocusesonthedesign,implementationandtestingofaPythonprogramthatusescharacterstringsforlookingattheDNAsequencesforkeyproteinsandseeingho</div> </li> <li><a href="/article/1892575660816265216.htm" title="【Docker】百度网盘:基于VNC的Web访问及后台下载" target="_blank">【Docker】百度网盘:基于VNC的Web访问及后台下载</a> <span class="text-muted">T0uken</span> <a class="tag" taget="_blank" href="/search/docker/1.htm">docker</a><a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF/1.htm">前端</a><a class="tag" taget="_blank" href="/search/dubbo/1.htm">dubbo</a> <div>本教程通过DockerCompose部署百度网盘的VNC版本,实现24小时不间断下载、双模式访问、数据持久化、自动重启和安全加密控制等核心功能。目录结构规划建议使用以下目录结构(可根据实际情况调整):~/baidunetdisk/├──docker-compose.yml├──config/└──downloads/创建docker-compose.ymlservices:baidunetdisk</div> </li> <li><a href="/article/1892575320599490560.htm" title="PHAS0008 - Experimental Methods" target="_blank">PHAS0008 - Experimental Methods</a> <span class="text-muted"></span> <a class="tag" taget="_blank" href="/search/%E5%90%8E%E7%AB%AF/1.htm">后端</a> <div>PHAS0008-ExperimentalMethodsCoursework(2024-25)TobesubmittedviaMoodle/Turnitinby17:00onMonday24thFebruary2025.Answerstoquestions1-3shouldbetype-writtenandsubmittedasasinglepdffile.Pleasebecarefultoexp</div> </li> <li><a href="/article/1892574526290587648.htm" title="【核心算法篇十三】《DeepSeek自监督学习:图像补全预训练方案》" target="_blank">【核心算法篇十三】《DeepSeek自监督学习:图像补全预训练方案》</a> <span class="text-muted">再见孙悟空_</span> <a class="tag" taget="_blank" href="/search/%E3%80%8C2025/1.htm">「2025</a><a class="tag" taget="_blank" href="/search/DeepSeek%E6%8A%80%E6%9C%AF%E5%85%A8%E6%99%AF%E5%AE%9E%E6%88%98%E3%80%8D/1.htm">DeepSeek技术全景实战」</a><a class="tag" taget="_blank" href="/search/%E7%AE%97%E6%B3%95/1.htm">算法</a><a class="tag" taget="_blank" href="/search/%E5%AD%A6%E4%B9%A0/1.htm">学习</a><a class="tag" taget="_blank" href="/search/%E8%AE%A1%E7%AE%97%E6%9C%BA%E8%A7%86%E8%A7%89/1.htm">计算机视觉</a><a class="tag" taget="_blank" href="/search/deepSeek/1.htm">deepSeek</a><a class="tag" taget="_blank" href="/search/%E6%B7%B1%E5%BA%A6%E5%AD%A6%E4%B9%A0/1.htm">深度学习</a><a class="tag" taget="_blank" href="/search/transformer/1.htm">transformer</a><a class="tag" taget="_blank" href="/search/%E4%BA%BA%E5%B7%A5%E6%99%BA%E8%83%BD/1.htm">人工智能</a> <div>引言:为什么自监督学习成为AI新宠?在传统监督学习需要海量标注数据的困境下,自监督学习(Self-SupervisedLearning)凭借无需人工标注的特性异军突起。想象一下,如果AI能像人类一样通过观察世界自我学习——这正是DeepSeek图像补全方案的技术哲学。根据,自监督学习通过设计巧妙的"预训练任务"(PretextTask),让模型在无标签数据中自动学习图像语义特征。而图像补全正是这类</div> </li> <li><a href="/article/1892574147041619968.htm" title="【大语言模型_3】ollama本地加载deepseek模型后回答混乱问题解决" target="_blank">【大语言模型_3】ollama本地加载deepseek模型后回答混乱问题解决</a> <span class="text-muted">没枕头我咋睡觉</span> <a class="tag" taget="_blank" href="/search/%E5%A4%A7%E8%AF%AD%E8%A8%80%E6%A8%A1%E5%9E%8B/1.htm">大语言模型</a><a class="tag" taget="_blank" href="/search/%E8%AF%AD%E8%A8%80%E6%A8%A1%E5%9E%8B/1.htm">语言模型</a><a class="tag" taget="_blank" href="/search/%E4%BA%BA%E5%B7%A5%E6%99%BA%E8%83%BD/1.htm">人工智能</a><a class="tag" taget="_blank" href="/search/%E8%87%AA%E7%84%B6%E8%AF%AD%E8%A8%80%E5%A4%84%E7%90%86/1.htm">自然语言处理</a> <div>背景:本地下载了DeepSeek-R1-Distill-Qwen-7B模型后,通过ollamacreateDeepSeek-R1-Distill-Qwen-7B-fds7b.mf加载模型启动后回答混乱,无法使用。解决方法重新下载模型,选择了DeepSeek-R1-Distill-Qwen-7B-Q4_K_M.gguf重新编写ds7b.mf文件,文件内容如下:FROM/root/zml/DeepSe</div> </li> <li><a href="/article/1892574046617399296.htm" title="全网最全!DeepSeek 新手入门教程合集" target="_blank">全网最全!DeepSeek 新手入门教程合集</a> <span class="text-muted"></span> <a class="tag" taget="_blank" href="/search/%E4%BA%BA%E5%B7%A5%E6%99%BA%E8%83%BDdeepseek/1.htm">人工智能deepseek</a> <div>如果你是初次接触DeepSeek的普通用户或开发者,面对海量教程却无从下手?别担心!本文为你整理全网最易懂、最实用的DeepSeek学习资源,涵盖快速上手、编程实战、系统手册等,附直达链接,收藏这一篇就够了!一、快速入门指南《DeepSeek入门教程》-博客园亮点:手把手教你注册账号、获取APIKey,并提供Python调用多轮对话的代码示例,适合初级开发者。直达链接:点击查看核心内容:API调用</div> </li> <li><a href="/article/1892573284986318848.htm" title="《计算机组成及汇编语言原理》阅读笔记:p1-p8" target="_blank">《计算机组成及汇编语言原理》阅读笔记:p1-p8</a> <span class="text-muted"></span> <a class="tag" taget="_blank" href="/search/%E7%BC%96%E7%A8%8B/1.htm">编程</a> <div>《计算机组成及汇编语言原理》学习第1天,p1-p8总结,总计8页。一、技术总结1.Intel8088microprocessor(微处理器),1979-1988。2.MS-DOSMicrosoftDiskOperatingSystem的缩写,是一个操作系统(operatingsystem)。3.Moore'sLaw&Moore'ssecondlaw(1)Moore'slawThenumberoft</div> </li> <li><a href="/article/1892572510000574464.htm" title="关于启动vue项目,出现:Error [ERR_MODULE_NOT_FOUND]: Cannot find module ‘xxx‘此类错误" target="_blank">关于启动vue项目,出现:Error [ERR_MODULE_NOT_FOUND]: Cannot find module ‘xxx‘此类错误</a> <span class="text-muted">zkkkkkkkkkkkkk</span> <a class="tag" taget="_blank" href="/search/vue/1.htm">vue</a><a class="tag" taget="_blank" href="/search/vue/1.htm">vue</a><a class="tag" taget="_blank" href="/search/node.js/1.htm">node.js</a><a class="tag" taget="_blank" href="/search/npm/1.htm">npm</a> <div>目录一、问题报错二、原因分析三、解决方法一、问题报错node环境变量配置有问题:(base)xxx@M73H-15:~/VueProject/pproject-vue$npmrundev/usr/bin/env:“node”:没有那个文件或目录vue项目启动有问题:(base)xxx:~/VueProject/pproject-vue$npmrundev>pproject-vue@0.0.0dev</div> </li> <li><a href="/article/128.htm" title="scala的option和some" target="_blank">scala的option和some</a> <span class="text-muted">矮蛋蛋</span> <a class="tag" taget="_blank" href="/search/%E7%BC%96%E7%A8%8B/1.htm">编程</a><a class="tag" taget="_blank" href="/search/scala/1.htm">scala</a> <div>原文地址: http://blog.sina.com.cn/s/blog_68af3f090100qkt8.html 对于学习 Scala 的 Java™ 开发人员来说,对象是一个比较自然、简单的入口点。在 本系列 前几期文章中,我介绍了 Scala 中一些面向对象的编程方法,这些方法实际上与 Java 编程的区别不是很大。我还向您展示了 Scala 如何重新应用传统的面向对象概念,找到其缺点</div> </li> <li><a href="/article/255.htm" title="NullPointerException" target="_blank">NullPointerException</a> <span class="text-muted">Cb123456</span> <a class="tag" taget="_blank" href="/search/android/1.htm">android</a><a class="tag" taget="_blank" href="/search/BaseAdapter/1.htm">BaseAdapter</a> <div>    java.lang.NullPointerException: Attempt to invoke virtual method 'int android.view.View.getImportantForAccessibility()' on a null object reference     出现以上异常.然后就在baidu上</div> </li> <li><a href="/article/382.htm" title="PHP使用文件和目录" target="_blank">PHP使用文件和目录</a> <span class="text-muted">天子之骄</span> <a class="tag" taget="_blank" href="/search/php%E6%96%87%E4%BB%B6%E5%92%8C%E7%9B%AE%E5%BD%95/1.htm">php文件和目录</a><a class="tag" taget="_blank" href="/search/%E8%AF%BB%E5%8F%96%E5%92%8C%E5%86%99%E5%85%A5/1.htm">读取和写入</a><a class="tag" taget="_blank" href="/search/php%E9%AA%8C%E8%AF%81%E6%96%87%E4%BB%B6/1.htm">php验证文件</a><a class="tag" taget="_blank" href="/search/php%E9%94%81%E5%AE%9A%E6%96%87%E4%BB%B6/1.htm">php锁定文件</a> <div>PHP使用文件和目录 1.使用include()包含文件 (1):使用include()从一个被包含文档返回一个值 (2):在控制结构中使用include()   include_once()函数需要一个包含文件的路径,此外,第一次调用它的情况和include()一样,如果在脚本执行中再次对同一个文件调用,那么这个文件不会再次包含。   在php.ini文件中设置</div> </li> <li><a href="/article/509.htm" title="SQL SELECT DISTINCT 语句" target="_blank">SQL SELECT DISTINCT 语句</a> <span class="text-muted">何必如此</span> <a class="tag" taget="_blank" href="/search/sql/1.htm">sql</a> <div>SELECT DISTINCT 语句用于返回唯一不同的值。 SQL SELECT DISTINCT 语句 在表中,一个列可能会包含多个重复值,有时您也许希望仅仅列出不同(distinct)的值。 DISTINCT 关键词用于返回唯一不同的值。 SQL SELECT DISTINCT 语法 SELECT DISTINCT column_name,column_name F</div> </li> <li><a href="/article/636.htm" title="java冒泡排序" target="_blank">java冒泡排序</a> <span class="text-muted">3213213333332132</span> <a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/%E5%86%92%E6%B3%A1%E6%8E%92%E5%BA%8F/1.htm">冒泡排序</a> <div>package com.algorithm; /** * @Description 冒泡 * @author FuJianyong * 2015-1-22上午09:58:39 */ public class MaoPao { public static void main(String[] args) { int[] mao = {17,50,26,18,9,10</div> </li> <li><a href="/article/763.htm" title="struts2.18 +json,struts2-json-plugin-2.1.8.1.jar配置及问题!" target="_blank">struts2.18 +json,struts2-json-plugin-2.1.8.1.jar配置及问题!</a> <span class="text-muted">7454103</span> <a class="tag" taget="_blank" href="/search/DAO/1.htm">DAO</a><a class="tag" taget="_blank" href="/search/spring/1.htm">spring</a><a class="tag" taget="_blank" href="/search/Ajax/1.htm">Ajax</a><a class="tag" taget="_blank" href="/search/json/1.htm">json</a><a class="tag" taget="_blank" href="/search/qq/1.htm">qq</a> <div>struts2.18  出来有段时间了! (貌似是 稳定版)   闲时研究下下!  貌似 sruts2 搭配 json 做 ajax 很吃香!   实践了下下! 不当之处请绕过! 呵呵   网上一大堆 struts2+json  不过大多的json 插件 都是 jsonplugin.34.jar   strut</div> </li> <li><a href="/article/890.htm" title="struts2 数据标签说明" target="_blank">struts2 数据标签说明</a> <span class="text-muted">darkranger</span> <a class="tag" taget="_blank" href="/search/jsp/1.htm">jsp</a><a class="tag" taget="_blank" href="/search/bean/1.htm">bean</a><a class="tag" taget="_blank" href="/search/struts/1.htm">struts</a><a class="tag" taget="_blank" href="/search/servlet/1.htm">servlet</a><a class="tag" taget="_blank" href="/search/Scheme/1.htm">Scheme</a> <div>数据标签主要用于提供各种数据访问相关的功能,包括显示一个Action里的属性,以及生成国际化输出等功能 数据标签主要包括: action :该标签用于在JSP页面中直接调用一个Action,通过指定executeResult参数,还可将该Action的处理结果包含到本页面来。 bean :该标签用于创建一个javabean实例。如果指定了id属性,则可以将创建的javabean实例放入Sta</div> </li> <li><a href="/article/1017.htm" title="链表.简单的链表节点构建" target="_blank">链表.简单的链表节点构建</a> <span class="text-muted">aijuans</span> <a class="tag" taget="_blank" href="/search/%E7%BC%96%E7%A8%8B%E6%8A%80%E5%B7%A7/1.htm">编程技巧</a> <div>/*编程环境WIN-TC*/ #include "stdio.h" #include "conio.h" #define NODE(name, key_word, help) \  Node name[1]={{NULL, NULL, NULL, key_word, help}} typedef struct node {  &nbs</div> </li> <li><a href="/article/1144.htm" title="tomcat下jndi的三种配置方式" target="_blank">tomcat下jndi的三种配置方式</a> <span class="text-muted">avords</span> <a class="tag" taget="_blank" href="/search/tomcat/1.htm">tomcat</a> <div>jndi(Java Naming and Directory Interface,Java命名和目录接口)是一组在Java应用中访问命名和目录服务的API。命名服务将名称和对象联系起来,使得我们可以用名称 访问对象。目录服务是一种命名服务,在这种服务里,对象不但有名称,还有属性。          tomcat配置</div> </li> <li><a href="/article/1271.htm" title="关于敏捷的一些想法" target="_blank">关于敏捷的一些想法</a> <span class="text-muted">houxinyou</span> <a class="tag" taget="_blank" href="/search/%E6%95%8F%E6%8D%B7/1.htm">敏捷</a> <div>从网上看到这样一句话:“敏捷开发的最重要目标就是:满足用户多变的需求,说白了就是最大程度的让客户满意。” 感觉表达的不太清楚。 感觉容易被人误解的地方主要在“用户多变的需求”上。 第一种多变,实际上就是没有从根本上了解了用户的需求。用户的需求实际是稳定的,只是比较多,也比较混乱,用户一般只能了解自己的那一小部分,所以没有用户能清楚的表达出整体需求。而由于各种条件的,用户表达自己那一部分时也有</div> </li> <li><a href="/article/1398.htm" title="富养还是穷养,决定孩子的一生" target="_blank">富养还是穷养,决定孩子的一生</a> <span class="text-muted">bijian1013</span> <a class="tag" taget="_blank" href="/search/%E6%95%99%E8%82%B2/1.htm">教育</a><a class="tag" taget="_blank" href="/search/%E4%BA%BA%E7%94%9F/1.htm">人生</a> <div> 是什么决定孩子未来物质能否丰盛?为什么说寒门很难出贵子,三代才能出贵族?真的是父母必须有钱,才能大概率保证孩子未来富有吗?-----作者:@李雪爱与自由 事实并非由物质决定,而是由心灵决定。一朋友富有而且修养气质很好,兄弟姐妹也都如此。她的童年时代,物质上大家都很贫乏,但妈妈总是保持生活中的美感,时不时给孩子们带回一些美好小玩意,从来不对孩子传递生活艰辛、金钱来之不易、要懂得珍惜</div> </li> <li><a href="/article/1525.htm" title="oracle 日期时间格式转化" target="_blank">oracle 日期时间格式转化</a> <span class="text-muted">征客丶</span> <a class="tag" taget="_blank" href="/search/oracle/1.htm">oracle</a> <div>oracle 系统时间有 SYSDATE 与 SYSTIMESTAMP; SYSDATE:不支持毫秒,取的是系统时间; SYSTIMESTAMP:支持毫秒,日期,时间是给时区转换的,秒和毫秒是取的系统的。 日期转字符窜: 一、不取毫秒: TO_CHAR(SYSDATE, 'YYYY-MM-DD HH24:MI:SS') 简要说明, YYYY 年 MM   月</div> </li> <li><a href="/article/1652.htm" title="【Scala六】分析Spark源代码总结的Scala语法四" target="_blank">【Scala六】分析Spark源代码总结的Scala语法四</a> <span class="text-muted">bit1129</span> <a class="tag" taget="_blank" href="/search/scala/1.htm">scala</a> <div>1. apply语法   FileShuffleBlockManager中定义的类ShuffleFileGroup,定义:   private class ShuffleFileGroup(val shuffleId: Int, val fileId: Int, val files: Array[File]) { ... def apply(bucketId</div> </li> <li><a href="/article/1779.htm" title="Erlang中有意思的bug" target="_blank">Erlang中有意思的bug</a> <span class="text-muted">bookjovi</span> <a class="tag" taget="_blank" href="/search/erlang/1.htm">erlang</a> <div>  代码中常有一些很搞笑的bug,如下面的一行代码被调用两次(Erlang beam) commit f667e4a47b07b07ed035073b94d699ff5fe0ba9b Author: Jovi Zhang <bookjovi@gmail.com> Date: Fri Dec 2 16:19:22 2011 +0100 erts:</div> </li> <li><a href="/article/1906.htm" title="移位打印10进制数转16进制-2008-08-18" target="_blank">移位打印10进制数转16进制-2008-08-18</a> <span class="text-muted">ljy325</span> <a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/%E5%9F%BA%E7%A1%80/1.htm">基础</a> <div> /** * Description 移位打印10进制的16进制形式 * Creation Date 15-08-2008 9:00 * @author 卢俊宇 * @version 1.0 * */ public class PrintHex { // 备选字符 static final char di</div> </li> <li><a href="/article/2033.htm" title="读《研磨设计模式》-代码笔记-组合模式" target="_blank">读《研磨设计模式》-代码笔记-组合模式</a> <span class="text-muted">bylijinnan</span> <a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F/1.htm">设计模式</a> <div>声明: 本文只为方便我个人查阅和理解,详细的分析以及源代码请移步 原作者的博客http://chjavach.iteye.com/ import java.util.ArrayList; import java.util.List; abstract class Component { public abstract void printStruct(Str</div> </li> <li><a href="/article/2160.htm" title="利用cmd命令将.class文件打包成jar" target="_blank">利用cmd命令将.class文件打包成jar</a> <span class="text-muted">chenyu19891124</span> <a class="tag" taget="_blank" href="/search/cmd/1.htm">cmd</a><a class="tag" taget="_blank" href="/search/jar/1.htm">jar</a> <div>cmd命令打jar是如下实现: 在运行里输入cmd,利用cmd命令进入到本地的工作盘符。(如我的是D盘下的文件有此路径 D:\workspace\prpall\WEB-INF\classes) 现在是想把D:\workspace\prpall\WEB-INF\classes路径下所有的文件打包成prpall.jar。然后继续如下操作: cd D: 回车 cd workspace/prpal</div> </li> <li><a href="/article/2287.htm" title="[原创]JWFD v0.96 工作流系统二次开发包 for Eclipse 简要说明" target="_blank">[原创]JWFD v0.96 工作流系统二次开发包 for Eclipse 简要说明</a> <span class="text-muted">comsci</span> <a class="tag" taget="_blank" href="/search/eclipse/1.htm">eclipse</a><a class="tag" taget="_blank" href="/search/%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F/1.htm">设计模式</a><a class="tag" taget="_blank" href="/search/%E7%AE%97%E6%B3%95/1.htm">算法</a><a class="tag" taget="_blank" href="/search/%E5%B7%A5%E4%BD%9C/1.htm">工作</a><a class="tag" taget="_blank" href="/search/swing/1.htm">swing</a> <div>                       JWFD v0.96 工作流系统二次开发包 for Eclipse 简要说明     &nb</div> </li> <li><a href="/article/2414.htm" title="SecureCRT右键粘贴的设置" target="_blank">SecureCRT右键粘贴的设置</a> <span class="text-muted">daizj</span> <a class="tag" taget="_blank" href="/search/secureCRT/1.htm">secureCRT</a><a class="tag" taget="_blank" href="/search/%E5%8F%B3%E9%94%AE/1.htm">右键</a><a class="tag" taget="_blank" href="/search/%E7%B2%98%E8%B4%B4/1.htm">粘贴</a> <div>一般都习惯鼠标右键自动粘贴的功能,对于SecureCRT6.7.5 ,这个功能也已经是默认配置了。 老版本的SecureCRT其实也有这个功能,只是不是默认设置,很多人不知道罢了。 菜单: Options->Global Options ...->Terminal 右边有个Mouse的选项块。 Copy on Select Paste on Right/Middle</div> </li> <li><a href="/article/2541.htm" title="Linux 软链接和硬链接" target="_blank">Linux 软链接和硬链接</a> <span class="text-muted">dongwei_6688</span> <a class="tag" taget="_blank" href="/search/linux/1.htm">linux</a> <div>1.Linux链接概念Linux链接分两种,一种被称为硬链接(Hard Link),另一种被称为符号链接(Symbolic Link)。默认情况下,ln命令产生硬链接。 【硬连接】硬连接指通过索引节点来进行连接。在Linux的文件系统中,保存在磁盘分区中的文件不管是什么类型都给它分配一个编号,称为索引节点号(Inode Index)。在Linux中,多个文件名指向同一索引节点是存在的。一般这种连</div> </li> <li><a href="/article/2668.htm" title="DIV底部自适应" target="_blank">DIV底部自适应</a> <span class="text-muted">dcj3sjt126com</span> <a class="tag" taget="_blank" href="/search/JavaScript/1.htm">JavaScript</a> <div><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml&q</div> </li> <li><a href="/article/2795.htm" title="Centos6.5使用yum安装mysql——快速上手必备" target="_blank">Centos6.5使用yum安装mysql——快速上手必备</a> <span class="text-muted">dcj3sjt126com</span> <a class="tag" taget="_blank" href="/search/mysql/1.htm">mysql</a> <div>第1步、yum安装mysql [root@stonex ~]#  yum -y install mysql-server 安装结果: Installed:     mysql-server.x86_64 0:5.1.73-3.el6_5                   &nb</div> </li> <li><a href="/article/2922.htm" title="如何调试JDK源码" target="_blank">如何调试JDK源码</a> <span class="text-muted">frank1234</span> <a class="tag" taget="_blank" href="/search/jdk/1.htm">jdk</a> <div>相信各位小伙伴们跟我一样,想通过JDK源码来学习Java,比如collections包,java.util.concurrent包。 可惜的是sun提供的jdk并不能查看运行中的局部变量,需要重新编译一下rt.jar。 下面是编译jdk的具体步骤:         1.把C:\java\jdk1.6.0_26\sr</div> </li> <li><a href="/article/3049.htm" title="Maximal Rectangle" target="_blank">Maximal Rectangle</a> <span class="text-muted">hcx2013</span> <a class="tag" taget="_blank" href="/search/max/1.htm">max</a> <div>Given a 2D binary matrix filled with 0's and 1's, find the largest rectangle containing all ones and return its area.   public class Solution { public int maximalRectangle(char[][] matrix)</div> </li> <li><a href="/article/3176.htm" title="Spring MVC测试框架详解——服务端测试" target="_blank">Spring MVC测试框架详解——服务端测试</a> <span class="text-muted">jinnianshilongnian</span> <a class="tag" taget="_blank" href="/search/spring+mvc+test/1.htm">spring mvc test</a> <div>随着RESTful Web Service的流行,测试对外的Service是否满足期望也变的必要的。从Spring 3.2开始Spring了Spring Web测试框架,如果版本低于3.2,请使用spring-test-mvc项目(合并到spring3.2中了)。   Spring MVC测试框架提供了对服务器端和客户端(基于RestTemplate的客户端)提供了支持。 &nbs</div> </li> <li><a href="/article/3303.htm" title="Linux64位操作系统(CentOS6.6)上如何编译hadoop2.4.0" target="_blank">Linux64位操作系统(CentOS6.6)上如何编译hadoop2.4.0</a> <span class="text-muted">liyong0802</span> <a class="tag" taget="_blank" href="/search/hadoop/1.htm">hadoop</a> <div>一、准备编译软件   1.在官网下载jdk1.7、maven3.2.1、ant1.9.4,解压设置好环境变量就可以用。     环境变量设置如下:   (1)执行vim /etc/profile (2)在文件尾部加入: export JAVA_HOME=/home/spark/jdk1.7 export MAVEN_HOME=/ho</div> </li> <li><a href="/article/3430.htm" title="StatusBar 字体白色" target="_blank">StatusBar 字体白色</a> <span class="text-muted">pangyulei</span> <a class="tag" taget="_blank" href="/search/status/1.htm">status</a> <div> [[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent]; /*you'll also need to set UIViewControllerBasedStatusBarAppearance to NO in the plist file if you use this method</div> </li> <li><a href="/article/3557.htm" title="如何分析Java虚拟机死锁" target="_blank">如何分析Java虚拟机死锁</a> <span class="text-muted">sesame</span> <a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/thread/1.htm">thread</a><a class="tag" taget="_blank" href="/search/oracle/1.htm">oracle</a><a class="tag" taget="_blank" href="/search/%E8%99%9A%E6%8B%9F%E6%9C%BA/1.htm">虚拟机</a><a class="tag" taget="_blank" href="/search/jdbc/1.htm">jdbc</a> <div>英文资料: Thread Dump and Concurrency Locks   Thread dumps are very useful for diagnosing synchronization related problems such as deadlocks on object monitors. Ctrl-\ on Solaris/Linux or Ctrl-B</div> </li> <li><a href="/article/3684.htm" title="位运算简介及实用技巧(一):基础篇" target="_blank">位运算简介及实用技巧(一):基础篇</a> <span class="text-muted">tw_wangzhengquan</span> <a class="tag" taget="_blank" href="/search/%E4%BD%8D%E8%BF%90%E7%AE%97/1.htm">位运算</a> <div>http://www.matrix67.com/blog/archives/263    去年年底写的关于位运算的日志是这个Blog里少数大受欢迎的文章之一,很多人都希望我能不断完善那篇文章。后来我看到了不少其它的资料,学习到了更多关于位运算的知识,有了重新整理位运算技巧的想法。从今天起我就开始写这一系列位运算讲解文章,与其说是原来那篇文章的follow-up,不如说是一个r</div> </li> <li><a href="/article/3811.htm" title="jsearch的索引文件结构" target="_blank">jsearch的索引文件结构</a> <span class="text-muted">yangshangchuan</span> <a class="tag" taget="_blank" href="/search/%E6%90%9C%E7%B4%A2%E5%BC%95%E6%93%8E/1.htm">搜索引擎</a><a class="tag" taget="_blank" href="/search/jsearch/1.htm">jsearch</a><a class="tag" taget="_blank" href="/search/%E5%85%A8%E6%96%87%E6%A3%80%E7%B4%A2/1.htm">全文检索</a><a class="tag" taget="_blank" href="/search/%E4%BF%A1%E6%81%AF%E6%A3%80%E7%B4%A2/1.htm">信息检索</a><a class="tag" taget="_blank" href="/search/word%E5%88%86%E8%AF%8D/1.htm">word分词</a> <div>jsearch是一个高性能的全文检索工具包,基于倒排索引,基于java8,类似于lucene,但更轻量级。   jsearch的索引文件结构定义如下:     1、一个词的索引由=分割的三部分组成:        第一部分是词        第二部分是这个词在多少</div> </li> </ul> </div> </div> </div> <div> <div class="container"> <div class="indexes"> <strong>按字母分类:</strong> <a href="/tags/A/1.htm" target="_blank">A</a><a href="/tags/B/1.htm" target="_blank">B</a><a href="/tags/C/1.htm" target="_blank">C</a><a href="/tags/D/1.htm" target="_blank">D</a><a href="/tags/E/1.htm" target="_blank">E</a><a href="/tags/F/1.htm" target="_blank">F</a><a href="/tags/G/1.htm" target="_blank">G</a><a href="/tags/H/1.htm" target="_blank">H</a><a href="/tags/I/1.htm" target="_blank">I</a><a href="/tags/J/1.htm" target="_blank">J</a><a href="/tags/K/1.htm" target="_blank">K</a><a href="/tags/L/1.htm" target="_blank">L</a><a href="/tags/M/1.htm" target="_blank">M</a><a href="/tags/N/1.htm" target="_blank">N</a><a href="/tags/O/1.htm" target="_blank">O</a><a href="/tags/P/1.htm" target="_blank">P</a><a href="/tags/Q/1.htm" target="_blank">Q</a><a href="/tags/R/1.htm" target="_blank">R</a><a href="/tags/S/1.htm" target="_blank">S</a><a href="/tags/T/1.htm" target="_blank">T</a><a href="/tags/U/1.htm" target="_blank">U</a><a href="/tags/V/1.htm" target="_blank">V</a><a href="/tags/W/1.htm" target="_blank">W</a><a href="/tags/X/1.htm" target="_blank">X</a><a href="/tags/Y/1.htm" target="_blank">Y</a><a href="/tags/Z/1.htm" target="_blank">Z</a><a href="/tags/0/1.htm" target="_blank">其他</a> </div> </div> </div> <footer id="footer" class="mb30 mt30"> <div class="container"> <div class="footBglm"> <a target="_blank" href="/">首页</a> - <a target="_blank" href="/custom/about.htm">关于我们</a> - <a target="_blank" href="/search/Java/1.htm">站内搜索</a> - <a target="_blank" href="/sitemap.txt">Sitemap</a> - <a target="_blank" href="/custom/delete.htm">侵权投诉</a> </div> <div class="copyright">版权所有 IT知识库 CopyRight © 2000-2050 E-COM-NET.COM , All Rights Reserved. <!-- <a href="https://beian.miit.gov.cn/" rel="nofollow" target="_blank">京ICP备09083238号</a><br>--> </div> </div> </footer> <!-- 代码高亮 --> <script type="text/javascript" src="/static/syntaxhighlighter/scripts/shCore.js"></script> <script type="text/javascript" src="/static/syntaxhighlighter/scripts/shLegacy.js"></script> <script type="text/javascript" src="/static/syntaxhighlighter/scripts/shAutoloader.js"></script> <link type="text/css" rel="stylesheet" href="/static/syntaxhighlighter/styles/shCoreDefault.css"/> <script type="text/javascript" src="/static/syntaxhighlighter/src/my_start_1.js"></script> </body> </html>