ディレクトリ
プレイする前に、Djangoの基礎
HTTPプロトコル(ハイパーテキストプロトコル)
4つの特性
TCP / IPベースのアプリケーション層の演技オーバー
要求応答に基づいて、
要求は、に応じて、送信されます
ステートレス
一度も与えることを忘れて、ユーザーの状態を保存しません
接続なし
例えば:1泊分の愛
データフォーマット
要求フォーマット
リクエストの最初の行(要求方法、プロトコルバージョン、等)
リクエストヘッダ(ロットK:Vキーと値のペア)
\ r個の\ nを
リクエストヘッダ(要求が取得できない場合にのみ、リアルタイムデータはPOSTリクエストを送信します)
応答形式
応答の最初の行
レスポンスヘッダ
\ r個の\ nを
レスポンスボディ
応答ステータスコード
いくつかの特定のデジタルデータを表現
1XX:サーバーは、追加データを提出することができます処理されている、あなたのデータを受信しました
2XX:成功応答サーバ(200件のリクエストに成功)
300番台:リダイレクション
4XX:リクエストエラー(404 403リソースを要求するためには、アクセスを拒否するために存在していません)
5xxの:(内部サーバーエラー(500))
リクエストメソッド
リクエストを取得
データへの他の人に
ポスト要求
他の人に:送信データ(ユーザのログインなど)
純粋な手でラインおよびWebフレームワーク
- 手動でソケットを書きます
- マニュアルデータ処理形式のhttp
単純なC / sの接続
#服务端
import socket
server = socket.socket()
server.bind(('127.0.0.1', 8081))
server.listen(5)
while True:
conn,addr = server.accept()
data = conn.recv(1024)
conn.send(b'HTTP/1.1 200 OK\r\n\r\n')
print(data)
conn.send(b'hello baby')
conn.close()
フレームもう少し複雑なウェブ
どのようなクライアントの要求、何が例えば、返します。クライアントが送信しhttp://127.0.0.1:8081/index
、クライアントにサーバーをindex
import socket
server = socket.socket()
server.bind(('127.0.0.1', 8081))
server.listen(5)
while True:
conn,addr = server.accept()
conn.send(b'HTTP/1.1 200 OK\r\n\r\n')
data = conn.recv(1024)
print(data)
data = data.decode('utf8')
current_path = data.split('\r\n')[0].split(' ')[1]
print(current_path)
if current_path == '/index':
conn.send(b'index')
#服务端还可以打开html文件,将文件中的东西显示给客户端
# with open(r'index.html', 'rb') as f:
# conn.send(f.read())
else:
conn.send(b'404 error')
conn.close()
ベースのwsgiref
私は上記のコードとインデックスと他のコンテンツ内のソケット接続を書きたくない場合は、クライアントが100個の異なる要求を送信し、私はああ100倍までの専門家ロールませんよ!それはあまりにも疲れているので、我々はwsgirefモジュールを使用して、我々は必要なコードのwsgiref.pyは、対応するファイルに記述され、次のされて置くことができ、私たちはよりシンプルで便利な動作を助けるために置くべきファイルがあります物事。
urls.pyルーティング機能およびオブジェクト・リレーショナル・ビューは、のviews.pyビュー機能(ビジネスロジック)置くテンプレートテンプレートフォルダ(htmlファイルの束を)
wsgiref.pyファイル
from wsgiref.simple_server import make_server
from urls import urls
from views import *
def run(env,response):
"""
:param env: 请求相关的所有数据
:param response: 响应相关的所有数据
:return:
"""
response('200 OK',[])
current_path = env.get('PATH_INFO') #env里面有 很多数据,我们筛选有用的数据就行
# 先定义一个变量名 用来存储后续匹配到的函数名
func = None
# for循环 匹配后缀
for url in urls:
if current_path == url[0]:
func = url[1] # 一旦匹配成功 就将匹配到的函数名赋值给func变量
break # 主动结束匹配
# 判断func是否有值
if func:
res = func(env)
else:
res = error(env)
return [res.encode('utf-8')]
if __name__ == '__main__':
server = make_server('127.0.0.1',8080,run)
# 实时监听该地址 只要有客户端来连接 统一交给run函数去处理
server.serve_forever() # 启动服务端,永远等着客户端来连接
urls.py
from views import *
urls = [
('/index',index), #第二个是函数,如果匹配成功,就去views.py中去找相应的函数去运行
('/login',login),
('/xxx',xxx),
]
views.py
from urls import urls
def index(env):
return 'index'
def login(env):
return 'login'
def error(env):
return '404 error'
def xxx(env):
return 'xxx'
クライアントは、辞書を介してサーバへのアクセス権を取得します
ここでは、モジュールを使用する必要がありますjinja2
私たちは、このモジュールをダウンロードして行く必要がありますfrom jinja2 import Template
具体的な知識jinja2
、リンクをクリックしてくださいhttps://www.cnblogs.com/yanjiayi098-001/p/11701150.html
wsgiref.pyファイル
from wsgiref.simple_server import make_server
from urls import urls
from views import *
def run(env,response):
"""
:param env: 请求相关的所有数据
:param response: 响应相关的所有数据
:return:
"""
response('200 OK',[])
current_path = env.get('PATH_INFO') #env里面有 很多数据,我们筛选有用的数据就行
# 先定义一个变量名 用来存储后续匹配到的函数名
func = None
# for循环 匹配后缀
for url in urls:
if current_path == url[0]:
func = url[1] # 一旦匹配成功 就将匹配到的函数名赋值给func变量
break # 主动结束匹配
# 判断func是否有值
if func:
res = func(env)
else:
res = error(env)
return [res.encode('utf-8')]
if __name__ == '__main__':
server = make_server('127.0.0.1',8080,run)
# 实时监听该地址 只要有客户端来连接 统一交给run函数去处理
server.serve_forever() # 启动服务端,永远等着客户端来连接
urls.py
urls = [
('/get_user',get_user), #第二个是函数,如果匹配成功,就去views.py中去找相应的函数去运行
]
views.py
def get_user(env):
d = {'name':'jason','pwd':'123','hobby':['read','running','music']}
with open(r'get_user.html','r',encoding='utf-8') as f:
data = f.read()
temp = Template(data) #将data数据传给这个temp,做处理
res = temp.render(user=d) # 将字典d传递给前端页面 页面上通过变量名user就能够获取到该字典
return res
get_user.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
#jinja2模块,可以对字典 进行以下取值,同时这是jinja变量取值 {{ }}的语法
<p>{{ user }}</p>
<p>{{ user.name }}</p>
<p>{{ user['pwd'] }}</p>
<p>{{ user.get('hobby') }}</p>
</body>
</html>
静的および動的なページ
静的ページ:書き込みが死んページです
ブラウザのページへの反応に変化させることにより、バックエンドのデータの場合:動的なページ
例えば:. 1は、現在の時刻を取得するために、フロントエンドにバックエンドを示し
フロントエンドへ2.データ取得バックエンドデータベースとディスプレイ
クライアントがサーバーにアクセスして現在の時刻を取得します
ユーザーがサーバーにアクセスするのであれば、クライアントのページには、現在の時刻が表示されますので、それを行う方法?
我々は、彼は時間がページに表示されますどのようにして、もはや時間で時間形式を符号化することにより、その後、HTMLで記述する場合は、ページは、HTMLを使用することであることを知っている必要がありますか?
実践:私たちは、特にコードを表示するために、文字列のHTML内の特定の文字のHTML文字列でwsgirefに基づいてモジュールを作成し、交流の時間のこれらのバックエンドを取得するために最初にしたいです
wsgiref.pyファイル
from wsgiref.simple_server import make_server
from urls import urls
from views import *
def run(env,response):
"""
:param env: 请求相关的所有数据
:param response: 响应相关的所有数据
:return:
"""
response('200 OK',[])
current_path = env.get('PATH_INFO') #env里面有 很多数据,我们筛选有用的数据就行
# 先定义一个变量名 用来存储后续匹配到的函数名
func = None
# for循环 匹配后缀
for url in urls:
if current_path == url[0]:
func = url[1] # 一旦匹配成功 就将匹配到的函数名赋值给func变量
break # 主动结束匹配
# 判断func是否有值
if func:
res = func(env)
else:
res = error(env)
return [res.encode('utf-8')]
if __name__ == '__main__':
server = make_server('127.0.0.1',8080,run)
# 实时监听该地址 只要有客户端来连接 统一交给run函数去处理
server.serve_forever() # 启动服务端,永远等着客户端来连接
urls.py
from views import *
urls = [
('/get_time',get_time), #第二个是函数,如果匹配成功,就去views.py中去找相应的函数去运行
]
views.py
from urls import *
from datetime import datetime
def get_time():
current_time = datetime.now().strftime('%Y-%m-%d %X')
with open(r'get_time.html','r',encoding='utf-8') as f: #这是一串字符串
data= f.read()
data = data.replace('$$time$$',current_time)
return data
get_time.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
$$time$$
</body>
</html>
クライアントがデータベースサーバにアクセスしてデータを取得します
今、データベースのデータおよび方法は、ほとんどの辞書のように得ることを得るが、私たちは、データベースを構築する必要があり、リンクを介してデータベース、データベースの値を取得するために中に入ります
wsgiref.pyファイル
from wsgiref.simple_server import make_server
from urls import urls
from views import *
def run(env,response):
"""
:param env: 请求相关的所有数据
:param response: 响应相关的所有数据
:return:
"""
response('200 OK',[])
current_path = env.get('PATH_INFO') #env里面有 很多数据,我们筛选有用的数据就行
# 先定义一个变量名 用来存储后续匹配到的函数名
func = None
# for循环 匹配后缀
for url in urls:
if current_path == url[0]:
func = url[1] # 一旦匹配成功 就将匹配到的函数名赋值给func变量
break # 主动结束匹配
# 判断func是否有值
if func:
res = func(env)
else:
res = error(env)
return [res.encode('utf-8')]
if __name__ == '__main__':
server = make_server('127.0.0.1',8080,run)
# 实时监听该地址 只要有客户端来连接 统一交给run函数去处理
server.serve_forever() # 启动服务端,永远等着客户端来连接
urls.py
urls = [
('/get_db',get_db), #第二个是函数,如果匹配成功,就去views.py中去找相应的函数去运行
]
views.py
import pymysql
def get_db(env):
conn = pymysql.connect(
host = '127.0.0.1',
port = 3306,
user = 'root',
password = 'root',
database = 'day56',
charset = 'utf8',
autocommit = True
)
cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)
sql = "select * from userinfo"
cursor.execute(sql) #提交sql语句,这个出发的是执行的对象并不是一个值
res = cursor.fetchall()
print(res)
with open(r'get_db.html','r',encoding='utf-8') as f:
data = f.read()
temp = Template(data)
ret = temp.render(user_list = res) # 将字典d传递给前端页面 页面上通过变量名user就能够获取到该字典
return ret
get_db.html
ここでは、典型的な動的なページであるページを構築するためにブートストラップを使用しました
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<script src="https://cdn.bootcss.com/jquery/3.4.1/jquery.min.js"></script>
<link href="https://cdn.bootcss.com/twitter-bootstrap/3.3.1/css/bootstrap.min.css" rel="stylesheet">
<script src="https://cdn.bootcss.com/twitter-bootstrap/3.3.1/js/bootstrap.min.js"></script>
</head>
<body>
<div class="container">
<div class="row">
<div class="col-md-8 col-md-offset-2">
<h1 class="text-center">用户列表</h1>
<table class="table table-bordered table-striped table-hover">
<thead>
<tr>
<th>id</th>
<th>name</th>
<th>pwd</th>
</tr>
</thead>
<tbody>
{% for user_dict in user_list %}
<tr>
<td>{{ user_dict.id }}</td>
<td>{{ user_dict.name }}</td>
<td>{{ user_dict.pwd }}</td>
</tr>
{% endfor %}
</tbody>
</table>
</div>
</div>
</div>
</body>
</html>
三の大PythonのWebフレームワーク
:ソケットパート
B:ルーティングとビュー機能との対応関係
C:テンプレート文法
ジャンゴ | フラスコ | 竜巻 |
---|---|---|
大型、特に大きな空母に似た機能が付属しています 時々あまりにも重いです |
小さいながらも、特に低いレンジャーと同様の特徴が付属して 、サードパーティ製のモジュールはジャンゴかけた場合、特に第3のモジュールにすべてを追加することができ 、サードパーティのモジュールへの依存度を |
非同期非ブロッキングが ゲームサーバを開発するために回帰し |
誰か他の人のwsgirefの使用 Bはそれを自分で書いた Cが自分を書くこと |
誰か他の人のWERKZEUGの使用(ベースwsgiref) Bは自分自身にそれを書いた 他の人Jinja2のとC |
3個の完全な書き込み、独自の |