ブログ[“markdown”]
2023-03-11
このチュートリアルでは、実際に一般的なウェブログを設定します。アクスムの船倉を救え
確かに、静的スペース ジェネレーターを利用して、Github ページと同じくらい多くのファイルをプッシュすることはできますが、それは別の場所で楽しむことができますか?
プロジェクト周辺[
“runtime-tokio-rustls”, “postgres”, “macros”, “time”] [2] 貨物 ユニークな weblog-rs – 置き場
私がジョグする依存関係は、ジョグの利用である ["runtime-tokio-rustls", "postgres", "macros", "time"] Cargo.toml[2] 設立
= 「weblog-rs」バージョン ="0.1.0" 版
=「2021」 [dependencies] [
tokio::spawn] トキオ ={
バージョン="1.13.0"、
機能
=["macros", "rt-multi-thread"]} axum =「0.6.4」
アスカマ ={バージョン="0.12.0" , 機能=["markdown"]} sqlx ={
バージョン
=["headers"] 「0.6」 , 機能 =[
"runtime-tokio-rustls", "postgres", "macros", "time"]} tower-http ={
バージョン
=「0.4」 、 機能=["runtime-tokio-rustls", "postgres", "macros", "time"]} 編集 main.rs localhost でサーバーを取得します: 4000/
利用する axum::{http::StatusCode、ルーティング::サルベージ、ルーター};
非同期 fn [2] 索引() -> 文字列 { 文字列::from(「ホームページ」
) } #[
tokio::spawn] 非同期
fn
主要
() { させて アプリ=Router::unique() . ルート(
"/"
axum::Server::bind(&
"0.0.0.0 : 4000".
パース().アンラップ ()) . ヘルプ(アプリ。into_make_service ()) .sit up for .アンラップ(); }
次のようにサーバーを起動します:
貨物 bustle main.rs
Tokio と Axum の簡単な紹介 Axum と Tokio を少し開梱しましょう.
Axum は私たちの Tokio、Hyper、Tower で構築された b フレームワーク 利用する
axum::{http::StatusCode、ルーティング::サルベージ、ルーター};
)Tokio により、非同期のノンブロッキング コードをバッスルできます (ただし、最大の場合はさらにブロッキング コードをバッスルします)。 )。 その構成要素は次のとおりです。 Bustle キューにプッシュされた業務を管理するスケジューラー の利用を可能にする非同期 I/O ドライバー キャッチ,
のコース 、信号。これはと同じです)
fn 主要() { tokio::runtime::Builder::new_multi_thread() 全て可能にする() .製造() . アンラップ["headers"] () block_on (async { // ランタイムのエントリーレベル }) }
Axum のルーターは、ハンドラーへのパスに適合します。 させて app=Router::unique()
.ルート("/ ", 引き上げ(索引));
)ハンドラーは引数としてゼロまたは追加のエクストラクタを受け入れることができます.抽出器の順序付けは、最も単純な 1 つの抽出器が期待の体を好きになることができるため、深刻です。 ハンドラーの右端に最後の引数として配置するのは、よそよそしい方法です。
IntoResponse トレイトを実装するもう 1 つのことは、ハンドラーによって返される可能性もあります。 Axum は、一般的な種類の面付けを処理します。
async fn 索引() -> 文字列 { 文字列::from(「ホームページ」) } イラストに修正テ、Axum の TypedHeader エクストラクタを利用して、パトロンにユーザー エージェントのヘルプを送信しましょう (このデモンストレーションの後、このエクストラクタと機能を削除することをお勧めします) まず でヘッダー機能を有効にしますCargo.toml[
tokio::spawn] axum [
2] ={バージョン
= 「0.6.4」 ,
機能 =[2]}
)その後、エクストラクターをインポートし、インデックス ハンドラーを編集して、ユーザー エージェントを抽出し、応答としてユーザーにヘルプを送信します。
利用する
axum::{
http::StatusCode、ルーティング::サルベージ、ルーター、
抽出::{TypedHeader}, ヘッダー::UserAgent、
};
// ジョグフォワードとバッスル "cargo bustle main.rs"
// localhost: 4000 はあなたの消費者エージェントを印刷することができます async ["runtime-tokio-rustls", "postgres", "macros", "time"] fn 索引
(TypedHeader( ユーザーエージェント): TypedHeader ) -> 文字列 { String::from(user_ エージェント。as_str ()) } データベースの設定 データベースを復旧して作業しましょう。 最初にダウンロードしてPostgreSQLをインストール[
tokio::spawn] 保証サービスが開始されました (私は Linux を使用しているので、これを適切に作成する方法は次のとおりです)sudo systemctl launch postgresql
ログインして利用するの psql
sudo -u postgres psql postgres
コンシューマーとデータベースをセットアップします (psql の内部では、入力したユーザー名とパスワードと共に次のコマンドが実行されます)<(), sqlx::Error>ロール myuser のログインパスワードの作成 「マイパス」 ; データベースの作成 mydb WITH オーナー =myuser; q 一意のコンシューマーでログインし、パスワードが表示されたらフォームを入力します。 私の場合は「mypass」.
psql -h localhost -d mydb -U myuser 私たちのウェブログの投稿を販売するテーブルを意図しています.
<_, Post>テーブルの作成 myposts( post_id [
2] シリアルプライマリキー 、投稿日 [2] 日にち
いいえ
ヌル デフォルト 現在の日付,
記事のタイトル
文章、post_body 文章
) );
)ジャイアント! 私の構想では、 でウェブログの投稿を設定するスキルmarkdown 構造。 私が利用しているエディターには ゴーストライター
。
私がこれを叫ぶのは、未調理のマークダウンを post_body というラベルの付いた世界に保存しようとジョギングしているからです。これで、アプリを PostgreSQL に参加させることができます [
"headers"] main.rs利用する sqlx::postgres::PgPoolOptions; 利用する
sqlx::FromRow; 利用する sqlx::種類::時刻::日付;
// SQL 期待値から取得するフィールド
#[2] pub 構造体
公開 { パブ
記事のタイトル: 弦、 パブ
投稿日
: 日にち、
パブ [tokio::spawn] post_body: 弦、 } #["headers"] async fn 主要() { させて プール=PgPoolOptions::unique() . max_connections( 5) // 入力資格情報を使用します .
加入(
"postgres://myuser:mypass@localhost/mydb") 。座る . へのクエリは脇に置きます(「データベースに参加できませんでした」);
// 私は最初にすべての投稿を取得し、最もうまく-このシステムの既知
// 各 Web ページの予期されるデータベースにヒットする方法を停止するには させて 投稿=sqlx::query_as::("myposts から post_title、post_date、post_body を持っている"))
unwrap
();
// 上記で取得した Vec // スレッド価値のある参照のために Arc で歌います。
させて
shared_state=Arc::unique(投稿);
させて app=Router::unique() .ルート("/"、 引き上げ(索引)) .ルート ("/役職/ :query_title",
引き上げ
(役職)) // 共有された sing をハンドラーに渡します
.with_state (shared_state);
//
データベースへのマークダウンの挿入
設立
= 「weblog-rs」バージョン ="0.1.0" 版
=「2021」
[dependencies] [
tokio::spawn] トキオ={
バージョン="1.13.0"
、
機能
アスカマ ={バージョン="0.12.0" , 機能=["markdown"]} sqlx ={
バージョン
=["headers"]「0.6」 , 機能 =[
"runtime-tokio-rustls", "postgres", "macros", "time"]} tower-http ={
バージョン
=「0.4」 、 機能=["runtime-tokio-rustls", "postgres", "macros", "time"]} 編集 main.rs localhost でサーバーを取得します: 4000/
利用する axum::{http::StatusCode、ルーティング::サルベージ、ルーター};
非同期 fn [2] 索引() -> 文字列 { 文字列::from(「ホームページ」
) } #[
tokio::spawn] 非同期
fn
主要() { させて アプリ=Router::unique() . ルート(
"/"
パース().アンラップ ()) . ヘルプ(アプリ。into_make_service ()) .sit up for .アンラップ(); }
次のようにサーバーを起動します:
貨物 bustle main.rs
Tokio と Axum の簡単な紹介 Axum と Tokio を少し開梱しましょう.
Axum は私たちの Tokio、Hyper、Tower で構築された b フレームワーク 利用する
axum::{http::StatusCode、ルーティング::サルベージ、ルーター};
)Tokio により、非同期のノンブロッキング コードをバッスルできます (ただし、最大の場合はさらにブロッキング コードをバッスルします)。 )。 その構成要素は次のとおりです。 Bustle キューにプッシュされた業務を管理するスケジューラー の利用を可能にする非同期 I/O ドライバー キャッチ,
のコース 、信号。これはと同じです)
fn 主要() { tokio::runtime::Builder::new_multi_thread() 全て可能にする() .製造() . アンラップ["headers"] () block_on (async { // ランタイムのエントリーレベル }) }
Axum のルーターは、ハンドラーへのパスに適合します。 させて app=Router::unique()
.ルート("/ ", 引き上げ(索引));
)ハンドラーは引数としてゼロまたは追加のエクストラクタを受け入れることができます.抽出器の順序付けは、最も単純な 1 つの抽出器が期待の体を好きになることができるため、深刻です。 ハンドラーの右端に最後の引数として配置するのは、よそよそしい方法です。
IntoResponse トレイトを実装するもう 1 つのことは、ハンドラーによって返される可能性もあります。 Axum は、一般的な種類の面付けを処理します。
async fn 索引() -> 文字列 { 文字列::from(「ホームページ」) } イラストに修正テ、Axum の TypedHeader エクストラクタを利用して、パトロンにユーザー エージェントのヘルプを送信しましょう (このデモンストレーションの後、このエクストラクタと機能を削除することをお勧めします) まず でヘッダー機能を有効にしますCargo.toml[
tokio::spawn] axum [
2] ={バージョン
= 「0.6.4」 ,
機能 =[2]}
)その後、エクストラクターをインポートし、インデックス ハンドラーを編集して、ユーザー エージェントを抽出し、応答としてユーザーにヘルプを送信します。
利用する
axum::{
http::StatusCode、ルーティング::サルベージ、ルーター、
抽出::{TypedHeader}, ヘッダー::UserAgent、
};
// ジョグフォワードとバッスル "cargo bustle main.rs"
// localhost: 4000 はあなたの消費者エージェントを印刷することができます async ["runtime-tokio-rustls", "postgres", "macros", "time"] fn 索引
(TypedHeader( ユーザーエージェント): TypedHeader ) -> 文字列 { String::from(user_ エージェント。as_str ()) } データベースの設定 データベースを復旧して作業しましょう。 最初にダウンロードしてPostgreSQLをインストール[
tokio::spawn] 保証サービスが開始されました (私は Linux を使用しているので、これを適切に作成する方法は次のとおりです)sudo systemctl launch postgresql
ログインして利用するの psql
sudo -u postgres psql postgres
コンシューマーとデータベースをセットアップします (psql の内部では、入力したユーザー名とパスワードと共に次のコマンドが実行されます)<(), sqlx::Error>ロール myuser のログインパスワードの作成 「マイパス」 ; データベースの作成 mydb WITH オーナー =myuser; q 一意のコンシューマーでログインし、パスワードが表示されたらフォームを入力します。 私の場合は「mypass」.
psql -h localhost -d mydb -U myuser 私たちのウェブログの投稿を販売するテーブルを意図しています.
<_, Post>テーブルの作成 myposts( post_id [
2] シリアルプライマリキー 、投稿日 [2] 日にち
いいえ
ヌル デフォルト 現在の日付,
記事のタイトル
文章、post_body 文章
) );
)ジャイアント! 私の構想では、 でウェブログの投稿を設定するスキルmarkdown 構造。 私が利用しているエディターには ゴーストライター
。
私がこれを叫ぶのは、未調理のマークダウンを post_body というラベルの付いた世界に保存しようとジョギングしているからです。これで、アプリを PostgreSQL に参加させることができます [
"headers"] main.rs利用する sqlx::postgres::PgPoolOptions; 利用する
sqlx::FromRow; 利用する sqlx::種類::時刻::日付;
// SQL 期待値から取得するフィールド
#[2] pub 構造体
公開 { パブ
記事のタイトル: 弦、 パブ
投稿日
: 日にち、
パブ [tokio::spawn] post_body: 弦、 } #["headers"] async fn 主要() { させて プール=PgPoolOptions::unique() . max_connections( 5) // 入力資格情報を使用します .
加入(
"postgres://myuser:mypass@localhost/mydb") 。座る . へのクエリは脇に置きます(「データベースに参加できませんでした」);
// 私は最初にすべての投稿を取得し、最もうまく-このシステムの既知
// 各 Web ページの予期されるデータベースにヒットする方法を停止するには させて 投稿=sqlx::query_as::("myposts から post_title、post_date、post_body を持っている"))
unwrap
();
// 上記で取得した Vec // スレッド価値のある参照のために Arc で歌います。
させて
shared_state=Arc::unique(投稿);
させて app=Router::unique() .ルート("/"、 引き上げ(索引)) .ルート ("/役職/ :query_title",
引き上げ
(役職)) // 共有された sing をハンドラーに渡します
.with_state (shared_state);
//
データベースへのマークダウンの挿入
次のようにサーバーを起動します:
貨物 bustle main.rs
Tokio と Axum の簡単な紹介 Axum と Tokio を少し開梱しましょう.
Axum は私たちの Tokio、Hyper、Tower で構築された b フレームワーク利用する
axum::{http::StatusCode、ルーティング::サルベージ、ルーター};
)Tokio により、非同期のノンブロッキング コードをバッスルできます (ただし、最大の場合はさらにブロッキング コードをバッスルします)。 )。 その構成要素は次のとおりです。 Bustle キューにプッシュされた業務を管理するスケジューラー の利用を可能にする非同期 I/O ドライバー キャッチ,
のコース 、信号。これはと同じです)
fn 主要() { tokio::runtime::Builder::new_multi_thread() 全て可能にする() .製造() . アンラップ["headers"] () block_on (async { // ランタイムのエントリーレベル }) }
Axum のルーターは、ハンドラーへのパスに適合します。 させて app=Router::unique()
.ルート("/ ", 引き上げ(索引));
)ハンドラーは引数としてゼロまたは追加のエクストラクタを受け入れることができます.抽出器の順序付けは、最も単純な 1 つの抽出器が期待の体を好きになることができるため、深刻です。 ハンドラーの右端に最後の引数として配置するのは、よそよそしい方法です。
IntoResponse トレイトを実装するもう 1 つのことは、ハンドラーによって返される可能性もあります。 Axum は、一般的な種類の面付けを処理します。
async fn 索引() -> 文字列 { 文字列::from(「ホームページ」) } イラストに修正テ、Axum の TypedHeader エクストラクタを利用して、パトロンにユーザー エージェントのヘルプを送信しましょう (このデモンストレーションの後、このエクストラクタと機能を削除することをお勧めします) まず でヘッダー機能を有効にしますCargo.toml[
tokio::spawn] axum [
2] ={バージョン
= 「0.6.4」 ,
機能 =[2]}
)その後、エクストラクターをインポートし、インデックス ハンドラーを編集して、ユーザー エージェントを抽出し、応答としてユーザーにヘルプを送信します。
利用する
axum::{
http::StatusCode、ルーティング::サルベージ、ルーター、
抽出::{TypedHeader}, ヘッダー::UserAgent、
};
// ジョグフォワードとバッスル "cargo bustle main.rs"
// localhost: 4000 はあなたの消費者エージェントを印刷することができます async ["runtime-tokio-rustls", "postgres", "macros", "time"] fn 索引
(TypedHeader( ユーザーエージェント): TypedHeader ) -> 文字列 { String::from(user_ エージェント。as_str ()) } データベースの設定 データベースを復旧して作業しましょう。 最初にダウンロードしてPostgreSQLをインストール[
tokio::spawn] 保証サービスが開始されました (私は Linux を使用しているので、これを適切に作成する方法は次のとおりです)sudo systemctl launch postgresql
ログインして利用するの psql
sudo -u postgres psql postgres
コンシューマーとデータベースをセットアップします (psql の内部では、入力したユーザー名とパスワードと共に次のコマンドが実行されます)<(), sqlx::Error>ロール myuser のログインパスワードの作成 「マイパス」 ; データベースの作成 mydb WITH オーナー =myuser; q 一意のコンシューマーでログインし、パスワードが表示されたらフォームを入力します。 私の場合は「mypass」.
psql -h localhost -d mydb -U myuser 私たちのウェブログの投稿を販売するテーブルを意図しています.
<_, Post>テーブルの作成 myposts( post_id [
2] シリアルプライマリキー 、投稿日 [2] 日にち
いいえ
ヌル デフォルト 現在の日付,
記事のタイトル
文章、post_body 文章
) );
)ジャイアント! 私の構想では、 でウェブログの投稿を設定するスキルmarkdown 構造。 私が利用しているエディターには ゴーストライター
。
私がこれを叫ぶのは、未調理のマークダウンを post_body というラベルの付いた世界に保存しようとジョギングしているからです。これで、アプリを PostgreSQL に参加させることができます [
"headers"] main.rs利用する sqlx::postgres::PgPoolOptions; 利用する
sqlx::FromRow; 利用する sqlx::種類::時刻::日付;
// SQL 期待値から取得するフィールド
#[2] pub 構造体
公開 { パブ
記事のタイトル: 弦、 パブ
投稿日
: 日にち、
パブ [tokio::spawn] post_body: 弦、 } #["headers"] async fn 主要() { させて プール=PgPoolOptions::unique() . max_connections( 5) // 入力資格情報を使用します .
加入(
"postgres://myuser:mypass@localhost/mydb") 。座る . へのクエリは脇に置きます(「データベースに参加できませんでした」);
// 私は最初にすべての投稿を取得し、最もうまく-このシステムの既知
// 各 Web ページの予期されるデータベースにヒットする方法を停止するには させて 投稿=sqlx::query_as::("myposts から post_title、post_date、post_body を持っている"))
unwrap
();
// 上記で取得した Vec // スレッド価値のある参照のために Arc で歌います。
させて
shared_state=Arc::unique(投稿);
させて app=Router::unique() .ルート("/"、 引き上げ(索引)) .ルート ("/役職/ :query_title",
引き上げ
(役職)) // 共有された sing をハンドラーに渡します
.with_state (shared_state);
//
データベースへのマークダウンの挿入
- Bustle キューにプッシュされた業務を管理するスケジューラー
のコース 、信号。
これはと同じです)
fn主要() { tokio::runtime::Builder::new_multi_thread()
全て可能にする()
.製造() . アンラップ["headers"] ()
block_on (async {
// ランタイムのエントリーレベル
})
// localhost: 4000 はあなたの消費者エージェントを印刷することができます async ["runtime-tokio-rustls", "postgres", "macros", "time"] fn}Axum のルーターは、ハンドラーへのパスに適合します。
させて
app=Router::unique()
.ルート(
"/ "
, 引き上げ(索引));
async)ハンドラーは引数としてゼロまたは追加のエクストラクタを受け入れることができます.抽出器の順序付けは、最も単純な 1 つの抽出器が期待の体を好きになることができるため、深刻です。 ハンドラーの右端に最後の引数として配置するのは、よそよそしい方法です。
IntoResponse トレイトを実装するもう 1 つのことは、ハンドラーによって返される可能性もあります。 Axum は、一般的な種類の面付けを処理します。
fn 索引
() -> 文字列 { 文字列::from(「ホームページ」
) }
= 「0.6.4」イラストに修正テ、Axum の TypedHeader エクストラクタを利用して、パトロンにユーザー エージェントのヘルプを送信しましょう (このデモンストレーションの後、このエクストラクタと機能を削除することをお勧めします)
tokio::spawn]まず でヘッダー機能を有効にしますCargo.toml[
2] ={バージョンaxum [
,
機能 =[2]})その後、エクストラクターをインポートし、インデックス ハンドラーを編集して、ユーザー エージェントを抽出し、応答としてユーザーにヘルプを送信します。
利用する
axum::{
http::StatusCode、ルーティング::サルベージ、ルーター、
抽出::{TypedHeader}, ヘッダー::UserAgent、
};
// ジョグフォワードとバッスル "cargo bustle main.rs"
索引
(TypedHeader(ユーザーエージェント): TypedHeader) -> 文字列 { String::from(user_ エージェント。as_str ()) }
データベースの設定 データベースを復旧して作業しましょう。 最初にダウンロードしてPostgreSQLをインストール[
tokio::spawn] 保証サービスが開始されました (私は Linux を使用しているので、これを適切に作成する方法は次のとおりです)
sudo
systemctl launch postgresql
ログインして利用するの psql
sudo -u postgres psql postgres
コンシューマーとデータベースをセットアップします (psql の内部では、入力したユーザー名とパスワードと共に次のコマンドが実行されます)
<(), sqlx::Error>ロール myuser のログインパスワードの作成 「マイパス」 ; データベースの作成 mydb WITH オーナー
=myuser; q
一意のコンシューマーでログインし、パスワードが表示されたらフォームを入力します。 私の場合は「mypass」.
psql -h localhost
-d mydb -U myuser
私たちのウェブログの投稿を販売するテーブルを意図しています.
<_, Post>テーブルの作成 myposts
(
。post_id [
2] シリアルプライマリキー、投稿日 [2] 日にち
いいえ
ヌルデフォルト 現在の日付,
記事のタイトル
文章、
post_body 文章
) );
)ジャイアント! 私の構想では、 でウェブログの投稿を設定するスキルmarkdown 構造。 私が利用しているエディターには
ゴーストライター私がこれを叫ぶのは、未調理のマークダウンを post_body というラベルの付いた世界に保存しようとジョギングしているからです。
"headers"] main.rsこれで、アプリを PostgreSQL に参加させることができます [
利用する sqlx::postgres::PgPoolOptions; 利用するsqlx::FromRow; 利用する sqlx::種類::時刻::日付;
// SQL 期待値から取得するフィールド
#[2] pub 構造体
公開 {
パブ
記事のタイトル
: 弦、 パブ
投稿日
: 日にち、
パブ [tokio::spawn] post_body
: 弦、 }
#["headers"] async
fn 主要() {
させて
プール=PgPoolOptions::unique() .
max_connections(
5
)
加入(
// 入力資格情報を使用します .
"postgres://myuser:mypass@localhost/mydb"
) 。座る .
へのクエリは脇に置きます(
「データベースに参加できませんでした」
);
// 私は最初にすべての投稿を取得し、最もうまく-このシステムの既知
// 各 Web ページの予期されるデータベースにヒットする方法を停止するには させて 投稿=sqlx::query_as::
("myposts から post_title、post_date、post_body を持っている"
))
unwrap
();// 上記で取得した Vec
// スレッド価値のある参照のために Arc で歌います。
させて
shared_state=Arc::unique(投稿);させて
app=Router::unique() .ルート
("/"
、 引き上げ(索引)) .ルート ("/役職/ :query_title",
引き上げ
(役職))// 共有された sing をハンドラーに渡します
.with_state(shared_state);
//
データベースへのマークダウンの挿入