真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

學(xué)習(xí)《FlaskWeb開(kāi)發(fā):基于Python的Web應(yīng)用開(kāi)發(fā)實(shí)戰(zhàn)》分享-創(chuàng)新互聯(lián)

# 學(xué)習(xí)《Flask Web開(kāi)發(fā):基于Python的Web應(yīng)用開(kāi)發(fā)實(shí)戰(zhàn)》分享

創(chuàng)新互聯(lián)公司專注于成都做網(wǎng)站、成都網(wǎng)站制作、網(wǎng)頁(yè)設(shè)計(jì)、網(wǎng)站制作、網(wǎng)站開(kāi)發(fā)。公司秉持“客戶至上,用心服務(wù)”的宗旨,從客戶的利益和觀點(diǎn)出發(fā),讓客戶在網(wǎng)絡(luò)營(yíng)銷中找到自己的駐足之地。尊重和關(guān)懷每一位客戶,用嚴(yán)謹(jǐn)?shù)膽B(tài)度對(duì)待客戶,用專業(yè)的服務(wù)創(chuàng)造價(jià)值,成為客戶值得信賴的朋友,為客戶解除后顧之憂。

- 一直在說(shuō)學(xué)習(xí)Python,對(duì)同事,對(duì)朋友,都說(shuō)我正在學(xué)習(xí)Python,這無(wú)形給自己一定的壓力,促使自己要去學(xué)習(xí),進(jìn)步。

- Python的語(yǔ)法看了忘,忘了再看。每天學(xué)習(xí)時(shí)長(zhǎng)不固定,會(huì)造成這樣的效果。

- 然后看到這本書《Flask Web開(kāi)發(fā):基于Python的Web應(yīng)用開(kāi)發(fā)實(shí)戰(zhàn)》,時(shí)間不長(zhǎng)不短,也學(xué)習(xí)了一段時(shí)間,前后看了兩三遍,學(xué)會(huì)了一些知識(shí),在這里做一個(gè)整理、分享。

- 堅(jiān)持學(xué)習(xí)很重要,活到老學(xué)到老,讓我們一起學(xué)習(xí)Python吧。

- 下面從一個(gè)小項(xiàng)目中,分享一下。

- 小項(xiàng)目:采集[`廖雪峰的官方網(wǎng)站`](http://www.liaoxuefeng.com/)部分教程,并在Web中展示。

- 小項(xiàng)目在`Mac OS X`,`python3`中運(yùn)行。(`python2`調(diào)試中)

## 1. 使用虛擬環(huán)境

- 與系統(tǒng)的Python解釋器分開(kāi),在項(xiàng)目中的私有副本

### 安裝

- 檢查virtualenv

```

$ virtualenv -- version

```

- 安裝virtualenv

```

$ sudo pip install virtualenv

```

- 新建一個(gè)文件夾作為項(xiàng)目目錄

- 按照慣例,一般虛擬環(huán)境會(huì)被命名為 venv

```

virtualenv venv

New python executable in venv/bin/python

Installing distribute......done.

Installing pip.............done.

```

- 可指定python版本

```

virtualenv venv --python=python2.7

virtualenv venv --python=python3.5

```

- 激活這個(gè)虛擬環(huán)境

```

source venv/bin/activate

```

- 為了提醒你已經(jīng)激活了虛擬環(huán)境,激活虛擬環(huán)境的 命令會(huì)修改命令行提示符,加入環(huán)境名

```

(venv) $

```

- 回到全局 Python 解釋器

```

deactivate

```

### 使用pip安裝Python包

- pip 的 安裝請(qǐng)參見(jiàn) [https://pip.pypa.io/en/latest/installing.html](https://pip.pypa.io/en/latest/installing.html)

- 在虛擬環(huán)境中安裝 Flask

```

(venv) $ pip install flask

```

- 嘗試導(dǎo)入 Flask

```

(venv) $ python

>>> import flask

>>>

```

### 第一個(gè)程序

```

from flask import Flask

app = Flask(__name__)#Flask 類的對(duì)象

'''

修飾器是 Python 語(yǔ)言的標(biāo)準(zhǔn)特性,可以使用不同的方式修改函數(shù)的行為。

慣常用法是使用修飾器把函數(shù)注冊(cè)為事件的處理程序

'''

#app.route 修飾器,把修飾的函數(shù)注冊(cè)為路由

@app.route('/')

def hello():

  return '

Hello World

'

#程序會(huì)顯示一個(gè)使用 name 動(dòng)態(tài)參數(shù)生成的歡迎消息

@app.route('/user/')

def user(name):

  return '

Hello, %s!

' % name

if __name__ == '__main__':#__name__=='__main__' 是 Python 的慣常用法

  app.run(debug=True)#要想啟用調(diào)試模式,我們可以把 debug 參數(shù)設(shè)為 True

```

### 運(yùn)行

```

#保存以上程序至上述項(xiàng)目根目錄 hello.py

(venv) $ python hellp.py

* Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)

* Restarting with stat

* Debugger is active!

* Debugger PIN: 277-775-896

#訪問(wèn) http://127.0.0.1:5000/ 與 http://127.0.0.1:5000/user/Python 即可

```

## 2. 初始項(xiàng)目結(jié)構(gòu)

```

|-flasky

  |-app/

      |-templates/

      |-static/

      |-main/

          |-__init__.py

          |-errors.py

          |-forms.py

          |-views.py

      |-collect/

          |-__init__.py

      |-__init__.py

      |-models.py

  |-migrations/

  |-venv/

  |-requirements.txt

  |-config.py

  |-manage.py

```

- Flask 程序一般都保存在名為 app 的包中;

- migrations文件夾包含數(shù)據(jù)庫(kù)遷移腳本;

- venv文件夾包含Python虛擬環(huán)境。

- pip 可以使用如下命令自動(dòng)生成requirements.txt文件

- 該文件便是項(xiàng)目中所需要的所有Python包

```

(venv) $ pip freeze > requirements.txt

```

- 創(chuàng)建一個(gè)新的虛擬環(huán)境,并在其上運(yùn)行以下命令

- 即可安裝該項(xiàng)目中所需要的所有Python包

```

(venv) $ pip install -r requirements.txt

```

- 創(chuàng)建遷移倉(cāng)庫(kù)

```

(venv) $ python manage.py db init

```

- 創(chuàng)建遷移腳本

```

(venv) $ python manage.py db migrate -m "initial migration"

```

- 更新數(shù)據(jù)庫(kù)

```

(venv) $ python manage.py db upgrade

```

- 啟動(dòng)腳本

```

(venv) $ python manage.py runserver

```

## 3. 定義模型

```

from datetime import datetime

from . import db

from sqlalchemy.dialects.mysql import TINYINT, LONGTEXT

from .collect import create_collect

class Index(db.Model):

  __tablename__ = 'indexs'

  id = db.Column(db.Integer, primary_key=True)

  name = db.Column(db.String(64))

  url = db.Column(db.String(255))

  html = db.Column(LONGTEXT)

  status = db.Column(TINYINT(3), default=0)

  dateline = db.Column(db.DateTime(), default=datetime.utcnow)

  lists = db.relationship('List', backref='list', lazy='dynamic')

  def __repr__(self):

      return '' % self.name

class List(db.Model):

  __tablename__ = 'lists'

  id = db.Column(db.Integer, primary_key=True)

  index_id = db.Column(db.Integer, db.ForeignKey('indexs.id'))

  name = db.Column(db.String(64))

  url = db.Column(db.String(255))

  html = db.Column(LONGTEXT)

  status = db.Column(TINYINT(3), default=0)

  dateline = db.Column(db.DateTime(), default=datetime.utcnow)

  def __repr__(self):

      return '' % self.name

```

## 4. 采集數(shù)據(jù)

```

#采集頁(yè)面列表

@manager.command

def collect_index(name='liaoxuefeng'):

  Index.index_add(name)

  Index.index_edit(name)

#采集列表頁(yè)面

@manager.command

def collect_list_add(name='liaoxuefeng'):

  List.list_add(name)

#采集列表內(nèi)容

@manager.command

def collect_list_edit(name='liaoxuefeng'):

  List.list_edit(name)

#在終端執(zhí)行

(venv) $ python manage.py collect_index

```

## 5. 定義路由

```

#首頁(yè) 采集頁(yè)面列表

@main.route('/')

def index():

  pass

#添加采集頁(yè)面

@main.route('/index_add', methods=['GET', 'POST'])

def index_add():

  pass

#編輯采集頁(yè)面

@main.route('/index_edit/', methods=['GET', 'POST'])

def index_edit(id):

  pass

#刪除添加采集頁(yè)面

@main.route('/index_delete/')

def index_delete(id):

  pass

#采集頁(yè)面下的列表頁(yè)面

@main.route('/index//list')

def index_list(id):

  pass

#列表頁(yè)面

@main.route('/list')

def list_list():

  pass

#添加列表頁(yè)面

@main.route('/list_add', methods=['GET', 'POST'])

def list_add():

  pass

#編輯列表頁(yè)面

@main.route('/list_edit/', methods=['GET', 'POST'])

def list_edit(id):

  pass

#刪除列表頁(yè)面

@main.route('/list_delete/')

def list_delete(id):

  pass

#詳細(xì)頁(yè)面

@main.route('/list_view/')

def list_view(id):

  pass

```

## 6. CRUD

```

from flask_wtf import FlaskForm

from wtforms import StringField, SelectField, RadioField, TextAreaField, SubmitField

from wtforms.validators import Required, Length, URL

from wtforms import ValidationError

from ..models import Index, List

class IndexForm(FlaskForm):

  name = StringField('Name', validators=[Length(0, 64)])

  url = StringField('Url', validators=[Required(), Length(1, 255), URL()])

  html = TextAreaField('Html')

  status = RadioField('Status', coerce=int, default='0')

  submit = SubmitField('Submit')

  def __init__(self, index=None, *args, **kwargs):

      super(IndexForm, self).__init__(*args, **kwargs)

      self.status.choices = [(0, 'Initial'), (1, 'Downloaded'), (2, 'Deprecated')]

      self.index = index

  def validate_url(self, field):

      if self.index is None:

          if Index.query.filter_by(url=field.data).first():

              raise ValidationError('Url already in use.')

      else:

          if self.index.url != field.data and \

                  Index.query.filter_by(url=field.data).first():

              raise ValidationError('Url already in use.')

class ListForm(FlaskForm):

  index_id = SelectField('Index id', coerce=int)

  name = StringField('Name', validators=[Length(0, 64)])

  url = StringField('Url', validators=[Required(), Length(1, 255), URL()])

  html = TextAreaField('Html')

  status = RadioField('Status', coerce=int, default=0)

  submit = SubmitField('Submit')

  def __init__(self, item=None, *args, **kwargs):

      super(ListForm, self).__init__(*args, **kwargs)

      self.index_id.choices = [(index.id, index.name) for index in Index.query.filter_by(status=1).all()]

      self.status.choices = [(0, 'Initial'), (1, 'Downloaded'), (2, 'Deprecated')]

      self.item = item

  def validate_url(self, field):

      if self.item is None:

          if List.query.filter_by(url=field.data).first():

              raise ValidationError('Url already in use.')

      else:

          if self.item.url != field.data and \

                  List.query.filter_by(url=field.data).first():

              raise ValidationError('Url already in use.')

```

## 7.運(yùn)行

- 本項(xiàng)目代碼存放在github中 [https://github.com/bstdn/flask_collect](https://github.com/bstdn/flask_collect)

```

#運(yùn)行項(xiàng)目

git clone https://github.com/bstdn/flask_collect.git

cd flask_collect

virtualenv venv

source venv/bin/activate

(venv) $ pip install -r requirements.txt

#定義環(huán)境變量 或 修改config.py中配置指定數(shù)據(jù)庫(kù)

(venv) $ export SECRET_KEY=

(venv) $ export DEV_DATABASE_URL=

(venv) $ python manage.py db upgrade

(venv) $ python manage.py collect_index

(venv) $ python manage.py collect_list_add

(venv) $ python manage.py collect_list_edit

(venv) $ python manage.py runserver

#訪問(wèn) http://127.0.0.1:5000/

```

創(chuàng)新互聯(lián)www.cdcxhl.cn,專業(yè)提供香港、美國(guó)云服務(wù)器,動(dòng)態(tài)BGP最優(yōu)骨干路由自動(dòng)選擇,持續(xù)穩(wěn)定高效的網(wǎng)絡(luò)助力業(yè)務(wù)部署。公司持有工信部辦法的idc、isp許可證, 機(jī)房獨(dú)有T級(jí)流量清洗系統(tǒng)配攻擊溯源,準(zhǔn)確進(jìn)行流量調(diào)度,確保服務(wù)器高可用性。佳節(jié)活動(dòng)現(xiàn)已開(kāi)啟,新人活動(dòng)云服務(wù)器買多久送多久。


當(dāng)前標(biāo)題:學(xué)習(xí)《FlaskWeb開(kāi)發(fā):基于Python的Web應(yīng)用開(kāi)發(fā)實(shí)戰(zhàn)》分享-創(chuàng)新互聯(lián)
標(biāo)題網(wǎng)址:http://weahome.cn/article/djhsoj.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部