我想同時使用Vue.js和Flask:Vue.js用於動態前端,Flask用於後端。我怎樣才能做到這一點?如何將Vue.js與Flask結合使用?
1
A
回答
2
我最近有這個問題(結合Vue.js和Flask)。
至少有兩種方法可以合併它們,具體取決於您是在創建1)簡單的Vue.js應用程序還是2)需要使用Webpack之類的模塊打包程序的更復雜的Vue.js應用程序結合Single-File Components或npm包。
簡單Vue.js應用:
這其實是相當容易和自身非常強大。下面的步驟可能不是'最佳實踐'的方式,但它會讓你開始:
- 如果你想Vue.js功能(「應用程序」)在自己的網頁上,創建一個新的模板
.html
文件。否則,只需打開任何.html
模板文件,您想要應用程序。- 這是您的Vue.js模板代碼將去的地方。
- 在您的
static
文件夾中創建一個新的JavaScript文件,在您想創建此應用程序後命名。- 這是您的Vue.js JavaScript代碼將去的地方。
- 在
.html
模板文件的底部包含一個包含Vue.js的腳本標記。<script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.3.4/vue.js"></script>
- 注意,版本號會改變,所以不要只是複製該行。您可以獲取最新版本here的鏈接。
- 也是在那個模板文件,也是在底部,包括腳本標記加載JavaScript文件剛剛創建。
<script src="%% url_for('static', filename='js/YOUR_APP_NAME.js') %%"></script>
- 創建具有的
app
的id
的.html
模板文件的新div
。<div id="app"></div>
下面是一個簡單的 「Hello World」 示例模板:
<head> <script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.5.13/vue.js"></script> </head> <body> <div id="app"> <p>{{ message }}</p> </div> <script> new Vue({ el: '#app', data: { message: 'Hello Vue.js!' } }) </script> </body>
如果您使用Jinja2的渲染你的模板,你將需要添加幾行的代碼告訴Jinja2不要使用
{{ }}
語法來呈現變量,因爲我們需要Vue.js的雙花括號符號。下面是你需要添加到您的app.py
做到這一點的代碼:class CustomFlask(Flask): jinja_options = Flask.jinja_options.copy() jinja_options.update(dict( variable_start_string='%%', # Default is '{{', I'm changing this because Vue.js uses '{{'/'}}' variable_end_string='%%', )) app = CustomFlask(__name__) # This replaces your existing "app = Flask(__name__)"
- 即成頁面如常。 /照常渲染模板文件。
- 如果你想,用一個Vue.js 2.0 Hello World JSFiddle做一些快速原型,然後在代碼複製到你的
.html
和.js
文件。- 確保小提琴使用的是最新版本的Vue.js!
簡單!
更復雜,使用的WebPack Vue.js應用:
- Install Node(它與故宮,這是我們所需要的)。
- 安裝vue-cli:
npm install -g @vue/cli
- 創建一個新的Vue.js的WebPack項目:
vue create my-project
- 一種方式做,這是創建一個
server
文件夾和一個client
文件夾,其中server
文件夾包含Flask服務器代碼,而client
文件夾包含Vue.js項目代碼。 - 另一種方法是將Vue.js項目作爲一個文件夾包含在您的Flask項目中。
- 設置您的WebPack的配置,使您的瓶
server/templates
文件夾中創建app.html
文件,靜態JavaScript和CSS通過app.html
需要的是在server/static/app/
文件夾中創建,從非使用的靜態資產隔離你瓶子的應用程序部分。 - 如果要將Vue.js項目與Flask項目結合使用,請從包含Vue.js項目的文件夾中運行
npm run build
,該文件夾將生成.html
文件和幾個靜態文件(JavaScript和CSS)。
我對我的WebPack配置做出確切的改變(通過我的git的承諾):
client/build/webpack.dev.conf.js
:
new HtmlWebpackPlugin({
- filename: 'index.html',
- template: 'index.html',
+ filename: 'app.html',
+ template: 'app.html',
這裏(以上)我改變的名稱Vue.js'啓動'文件到app.html,以便它不會與我的Flask應用程序的'index.html'衝突。
client/config/index.js
:
module.exports = {
build: {
env: require('./prod.env'),
- index: path.resolve(__dirname, '../dist/index.html'),
- assetsRoot: path.resolve(__dirname, '../dist'),
- assetsSubDirectory: 'static',
- assetsPublicPath: '/',
+ index: path.resolve(__dirname, '../../server/templates/app.html'),
+ assetsRoot: path.resolve(__dirname, '../../server/static/app'),
+ assetsSubDirectory: '',
+ assetsPublicPath: '/static/app',
這裏(以上)我設置在app.html文件和靜態資產應創建。
因爲我們指導的WebPack產生瓶的「靜態」文件夾(/static/app/
)內的靜態資產...
- 的相對URL包括
html
文件中的這些資產將被自動設置正確通過Webpack。- 例:
src=/static/app/js/app.f5b53b475d0a8ec9499e.js
- 例:
- 當這些網址查詢的文件,瓶將自動知道如何爲他們服務,因爲他們是
static/
文件夾,這瓶假設有一個/static/etc.
URL中。- 唯一生成的需要燒瓶路線的文件是
app.html
文件。
- 唯一生成的需要燒瓶路線的文件是
client/build/webpack.prod.conf.js
:
new HtmlWebpackPlugin({
filename: process.env.NODE_ENV === 'testing'
- ? 'index.html'
+ ? 'app.html'
: config.build.index,
- template: 'index.html',
+ template: 'app.html',
這裏(如上圖),我只是重命名 '推出' 頁面,相同webpack.dev.conf.js
。
routes.py
:
@web_routes.route('/app')
@login_required
def app():
if current_user.datetime_subscription_valid_until < datetime.datetime.utcnow():
return redirect(url_for('web_routes.pay'))
return render_template('app.html')
這裏(上圖)是我的渲染功能。我正在使用Flask's Blueprints功能(<blueprint_name>.route
),但您不需要。
相關問題
- 1. Flask藍圖與Flask-JWT結合使用
- 2. 如何將py.test裝置與Flask-SQLAlchemy和PostgreSQL結合使用?
- 3. 如何將ColorDrawable與ImageView結合使用?
- 4. 如何將Scrapy與Mysql結合使用?
- 5. 如何將ArrayAdapter與Parcelables結合使用?
- 6. 如何將Clutter與C#結合使用?
- 7. 如何將TestNG與Roboelectric結合使用?
- 8. 如何將NUnit3與ReportUnit結合使用?
- 9. 如何將windowIsFloating與ActionBar結合使用?
- 10. 如何將List與Intents結合使用?
- 11. 如何將Grails與GrapheneDB結合使用
- 12. 如何使用APSW與Flask
- 13. 如何結合使用cytoscape.js和vue.js動態組件的keep-alive?
- 14. 如何將課堂與有條件的課堂相結合? vue.js 2
- 15. Jinja2:Flask的url_for()與Knockout的attr綁定結合使用
- 16. 如何將'namedtuple'結構與'pickle'結合使用?
- 17. nginx如何與運行Flask應用的uWSGI配合使用?
- 18. 使用hasClass與vue.js
- 19. Vue.JS - 如何使用本地存儲與Vue.JS
- 20. 是否有可能將Flask與金字塔結合?
- 21. initWithCoder如何與Interface Builder結合使用?
- 22. 如何將Bumblebee和QtCreator結合使用?
- 23. 如何將PHP和Prolog結合使用
- 24. 將Specflow與Web服務結合使用
- 25. Java Swing:將RowFilter.andFilter與RowFilter.orFilter結合使用
- 26. 將PDF與rails結合使用combine_pdf
- 27. 將Hadoop DistributedCache與存檔結合使用
- 28. 將jQuery與SQL結合使用
- 29. 將ASP.Net MVC與WebForms結合使用
- 30. 將LINQ與OData結合使用AddQueryOption
這將是很好,如果你提供鏈接github項目與設置:)。我也偶然發現了這個問題(答案的第二部分),但問題很多。 – Pradeepb
這是一個好主意......不幸的是,我可以看到帶我一陣子。我可能會在某個時候解決它。如果你(或其他人)最終這樣做,我會添加鏈接到答案。 –
另外,如果你是從頭開始,我建議看看Nuxt(https://nuxtjs.org/)。 – siegerts