学習のDjangoの道
基本的なWebフレームワークを実現
1.純粋な手のラインとWebフレームワーク。
1、手書きコードソケット
2、手動処理データHTTP
#socket套接字 インポートソケット サーバ= socket.socket() server.bind(( '127.0.0.1'、8080)) server.listen(5) 一方、TRUE: CONN、ADDR = server.accept() データ= CONN。 RECV(1024) conn.send(b'HTTP / 1.1 200 OKの\ r \ n \ rをする\ n ') #印刷(データ) データ= data.decode(' UTF-8 ') CURRENT_PATH = data.split(' \ Rを\ n ')[0] .split(' ')[1] #プリント(CURRENT_PATH) 場合CURRENT_PATH == '/インデックス': #1 conn.send(b'index') \パイソン:(オープンr'Dと脱产10期视频\ day51 \ 01纯手撸HTML文件の.html」、 'RB' Fとして): conn.send(f.read()) ELIFのCURRENT_PATH == '/ログイン': CONN。(b'login')を送ります(b'login')を送信し 、他: conn.send(b'hello世界! ') はconn.close()
#类型转换 世界b'helloデータ=」 データ=のSTR(データ、エンコード= 'UTF-8') 、印刷(データ) データ=バイト(データ、エンコード= 'UTF-8') 、印刷(データ)
私たちはscoketとHTTPデータを対処するためwsgirefモジュールに基づいて、2
wsgirefモジュール
あなたはデータの操作を容易にするため、あなたにあなたを送信するために役立つ辞書にパッケージ化1、要求、パースHTTPデータ、。
2、ウェイhttpプロトコル形式のラインにあなたの再パッケージデータを支援するために自動的に応答する時間がかかり、その後、フロントに戻りました
RUN DEF(ENV、応答): "" " ENV関連データがリクエストである に関するデータに対する応答 """ #プリント(ENV) 応答( '200 OK'で、[]) CURRENT_PATH = env.get( 'PATH_INFO' ) #印刷(CURRENT_PATH) #CURRENT_PATH IF == '/インデックス':# リターン[b'index '] #1 ELIFのCURRENT_PATH ==' /ログイン': #リターン[b'login'] #フラグに格納された関数名を定義しますビット FUNC =なし URLにURLの: #は現在のURLがタプル内にないと判断し たURL場合は[0] == CURRENT_PATH。 #URLはそれがFUNCのに割り当てられている機能の対応する名前の上に置くサフィックス一致した場合 FUNCを= URL [1] 試合はすぐに終了し、ループのためのリソースを保存する必要がありたら# 休憩を 変数#FUNC上で判断を下すために IF FUNC: RES = FUNC(ENV) 他: RESの=エラー(ENV) リターン[res.encode( 'UTF-8')] IF __name__ == '__main__': サーバーはmake_server =(「は127.0 .0.1」、8080、実行) #をリアルタイムで自動的に括弧に接続するクライアント一度127.0.0.1:8080アドレスを監視することがrunメソッドの呼び出し、 server.serve_forever()#をサーバを起動します
3.パッケージルーティングと対応、文書やビュー機能、フォルダ内のすべてのサイトテンプレートで使用されるすべてのHTMLファイルの数を表示
1、urls.pyルーティングおよび表示機能の対応関係
2、views.pyビュー機能(関数は、ビュー機能を意味するだけでなく、クラスであってもよいです)
3、テンプレートフォルダをテンプレート
#urls 代码.viewsインポート*のから のURL = [ ( '/インデックス'、インデックス)、 ('/ログイン'、ログイン)、 ('/ REG'、REG)、 ('/ GET_TIME'、GET_TIME)、 ('/ GET_USER」、GET_USER)、 ('/ get_db'、get_db) ]
#views DEF指数(ENV): リターン'インデックス' DEFログイン(ENV): リターン'ログイン' DEFエラー(ENV): リターン'404エラー' DEF REG(ENV): リターン'REG' 日時日時インポートから DEF GET_TIME( ENV): モジュールによって#後端が現在時刻データを取得するための時間である 。= DateTime.Now()のstrftime( '%Y-M - %%% X-D' CURRENT_TIME)を 開く(r'templates / 02 get_time.html 'と'R&LT'、エンコード= 'UTF-8')F AS: データは、f.read =()#データは、実際の文字列は何ものシリーズである、到達!!! データ= data.replaceを( '$$時間' 、CURRENT_TIME) 返信データ Jinja2のインポートテンプレートから DEF GET_USER(ENV): = {user_dict 'ユーザ名': 'ジェイソン'、 'パスワード': '123'、 '趣味':[ '読む'、 'ゲーム'、 'を実行']} オープン(r'templates / 03 get_user.html」は、 'R&LT'、エンコード= 'UTF-8')、F AS: データは、f.read =()に達し TEMP =テンプレート(データ) RES = temp.render(データ= user_dict)#パスを変数名によってフロントページにフロントuser_dictページそれは、データ・ディクショナリを取得することが可能である リターンRES インポートをpymysql DEF get_db(ENV): コネティカット= pymysql.connect( ホスト= '127.0.0.1'、 ポート= 3306、 ユーザー= 'ルート'、 パスワード= '123'、 データベース= ' day51 ' 文字セット=' UTF8」 自動コミット=真 ) カーソル= conn.cursor(pymysql.cursors.DictCursor) SQLは= "ユーザー情報SELECT * FROM" affect_rows = cursor.execute(SQL) データ= cursor.fetchall() #印刷(データ) オープン(r'templates / 04 get_db.htmlと'R ''、エンコーディング=' UTF- 8' )Fとして: DATA1 = f.read() TEMP =テンプレート(DATA1) RES = temp.render(user_list =データ) のリターンRES
Jinja2のに基づい4.テンプレートをレンダリング達成します
テンプレートをレンダリング
、優れたバックエンドのデータを生成し、フロントページを使用するには、いくつかの方法を転送(フロントページを簡単に、より迅速な構文に基づいて、バックエンドのデータを渡すことができます)
PythonのWebフレームワークは、3つの主流と分析を紹介します
1.Django:大規模かつ特殊な機能が付属していますが、時々あまりにも重い、特に大型空母に似ています
2.Flask:Dapperの自身の特定の特別な機能は、すべてのサードパーティコンポーネントにあまり依存しているサードパーティコンポーネントの特にフラスコフレームワーク、フラスコを完全ジャンゴの陰に隠れている場合、すべての第三者まで追加、比較は、第三者によって制限されます開発者
3.Tornado:非常に高速に耐え高い同時実行が可能な非ブロックの非同期フレームワークに生まれ、あなたはゲームサーバーを開発することができます
:ソケット
B:ルーティングとビュー機能の一致
C:テンプレート構文
ジャンゴ
A:他の人とwsgiref
B:自分の書く
Cを:自分自身が書いた
フラスコ
Aを:wsgiref他人>>> WERKZEUGと
B:自分の書く
Cを:誰か他の人のJinja2の使用
トルネード
、B、Cであるすべて自分自身を書くために
Djangoの使用
「」 " 問題のバージョン: 問題と2.xのDjangoのバージョン1.x(これは1.11.11への学習オブジェクトです) 注意事項: 1.コンピュータの名前を中国持つことができない ファイル2の名前が中国を使用しないようにしてください 3. pycharmウィンドウはウィンドウの下に置かれた複数の項目を入れていないだけで一つのプロジェクトを持つことができます 。「」 "
Djangoはダウンロードしてインストール
#djangoダウンロード #コマンドラインでは、ノック: PIP3は、Djangoの== 1.11.11インストール ダウンロードが成功したかどうかを確認する# :#コマンドラインでノック ジャンゴ-ADMINを
Djangoプロジェクトを作成します。
コマンドライン
1.コマンドラインDjangoプロジェクトを作成します。
ジャンゴ管理者startprojectのプロジェクト名
2.コマンドライン(別個の機能に対応するアプリケーション)にDjangoアプリケーションを作成します
ジャンゴ管理者startappのアプリケーション名
python manage.py startappのアプリケーション名
3.コマンドラインDjangoのプロジェクトを開始
python manage.pyのrunserver
注:コマンドラインDjangoのプロジェクトは、自動的に新しいテンプレートテンプレートフォルダを作成せず、手動でファイルのsettings.pyファイルの登録にご自身のニーズや独自のパスを作成する必要があります
pycharmショートカット
Djangoプロジェクトを作成します。
Djangoプロジェクトを作成します。
:
2:
(******)
それ以外の場合は認識されないで設定を有効にするには、アプリケーションによって作成された登録する必要があります
手動で設定temlatesへのパスを追加する必要がない場合
Djangoのプロジェクトを開始
Djangoは終了後のページを作成します
メインのファイルフォルダプレゼンテーションジャンゴ
プロジェクトファイル名
プロジェクトフォルダと同じ名前を
settings.pyユーザ設定可能に暴露されたファイルをDjangoの
間urls.pyルーティングおよび表示機能対応
manage.py Djangoのファイル入口
アプリケーションフォルダの
移行フォルダデータベース移行レコードが
管理ジャンゴのadmin.py
のアプリを.py登録申請関連
models.py ORMモデルクラス
tests.pyテストファイル
views.pyビュー機能
Djangoの基盤に必要な3ピース:
django.shortcutsからのHttpResponseをインポートし、レンダリング、リダイレクト
HttpResponse
内部ブラウザに文字列パラメータとリターンを渡します。
例えば:
render
除request参数外还接受一个待渲染的模板文件和一个保存具体数据的字典参数。
将数据填充进模板文件,最后把结果返回给浏览器。(类似于我们上面用到的jinja2)
例如:
redirect
接受一个URL参数,表示跳转到指定的URL(重定向)。
例如:
基础web框架的实现
1.纯手撸web框架。
1、手动书写socket代码
2、手动处理http数据
#socket套接字 import socket server = socket.socket() server.bind(('127.0.0.1',8080)) 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) data = data.decode('utf-8') current_path = data.split('\r\n')[0].split(' ')[1] # print(current_path) if current_path == '/index': # conn.send(b'index') with open(r'D:\python脱产10期视频\day51\01 纯手撸html文件.html','rb') as f: conn.send(f.read()) elif current_path == '/login': conn.send(b'login') else: conn.send(b'hello world!') conn.close()
#类型转换 data = b'hello world' data = str(data,encoding='utf-8') print(data) data = bytes(data,encoding='utf-8') print(data)
2.基于wsgiref模块帮助我们处理scoket以及http数据
wsgiref模块
1、请求来的时候,解析http数据,帮你打包成一个字典传输给你,便于你操作各项数据。
2、响应走的时候,自动帮你把数据再打包成符合http协议格式的样子,再返回给前端
def run(env,response): """ env是请求相关的数据 response是响应相关的数据 """ # print(env) response('200 OK',[]) current_path = env.get('PATH_INFO') # print(current_path) # if current_path == '/index': # return [b'index'] # elif current_path == '/login': # return [b'login'] # 定义一个存储函数名的标志位 func = None for url in urls: # 判断当前url在不在元组内 if url[0] == current_path: # 只要匹配上了 就把url后缀对应的函数名赋值给func func = url[1] # 一旦匹配上 应该立刻退出for循环 节省资源 break # 对变量func做判断 if func: res = func(env) else: res = errors(env) return [res.encode('utf-8')] if __name__ == '__main__': server = make_server('127.0.0.1',8080,run) # 实时监测127.0.0.1:8080地址 一旦有客户端来连接 会自动加括号调用run方法 server.serve_forever() # 启动服务端
3.封装路由与视图数对应关系,以及视图函数文件,网站用到的所有html文件全部放在了templates文件夹下
1、urls.py路由与视图函数对应关系
2、views.py视图函数(视图函数不单单指函数,也可以是类)
3、templates模板文件夹
#urls from 代码.views import * urls = [ ('/index',index), ('/login',login), ('/reg',reg), ('/get_time',get_time), ('/get_user',get_user), ('/get_db',get_db), ]
#views def index(env): return 'index' def login(env): return 'login' def errors(env): return '404 error' def reg(env): return 'reg' from datetime import datetime def get_time(env): # 借助于时间模块 现在后端获取到时间数据 current_time = datetime.now().strftime('%Y-%m-%d %X') with open(r'templates/02 get_time.html','r',encoding='utf-8') as f: data = f.read() # data其实就是一串字符串 仅此而已!!! data = data.replace('$$time$$',current_time) return data from jinja2 import Template def get_user(env): user_dict = {'username':'jason','password':'123','hobby':['read','game','running']} with open(r'templates/03 get_user.html','r',encoding='utf-8') as f: data = f.read() temp = Template(data) res = temp.render(data = user_dict) # 将user_dict传递给前端页面 前端页面通过变量名data就能够获取到该字典 return res import pymysql def get_db(env): conn = pymysql.connect( host = '127.0.0.1', port = 3306, user = 'root', password = '123', database = 'day51', charset = 'utf8', autocommit = True ) cursor = conn.cursor(pymysql.cursors.DictCursor) sql = "select * from userinfo" affect_rows = cursor.execute(sql) data = cursor.fetchall() # print(data) with open(r'templates/04 get_db.html','r',encoding='utf-8') as f: data1 = f.read() temp = Template(data1) res = temp.render(user_list= data) return res
4.基于jinja2实现模板的渲染
模板的渲染
后端生成好数据,通过某种方式传递给前端页面使用(前端页面可以基于语法更加快捷简便使用后端传过来的数据)
python三大主流web框架介绍和分析
1.Django:大而全 自带的功能特别特别多 就类似于航空母舰 有时候过于笨重
2.Flask:短小精悍 自带的功能特别特别少 全都是依赖于第三方组件,flask框架第三方的组件特别多,如果把flask第三方全部加起来 完全可以盖过Django,比较受限于第三方的开发者
3.Tornado:天生的异步非阻塞框架 速度特别快 能够抗住高并发,可以开发游戏服务器
A:socket
B:路由与视图函数匹配
C:模板语法
Django
A:用的别人的 wsgiref
B:自己写的
C:自己写的
Flask
A:用的别人的 wsgiref>>> werkzeug
B:自己写的
C:用的别人的 jinja2
Tornado
A,B,C全都是自己写的
Django的使用
""" 版本问题: django版本问题1.x和2.x(本次以1.11.11为学习对象) 注意事项: 1.你的计算机的名称不能有中文 2.文件的命名尽量也不要用中文 3.一个pycharm窗口只能有一个项目 不要把多个项目放在一个窗口下 """
Django的下载与安装
#django下载 #命令行内敲: pip3 install django==1.11.11 #确认是否下载成功 #命令行内敲: django-admin
Django的项目创建
命令行式
1.命令行创建django项目
django-admin startproject 项目名
2.命令行内创建django应用(一个应用对应一块独立的功能)
django-admin startapp 应用名
python manage.py startapp 应用名
3.命令行启动django项目
python manage.py runserver
注意 :用命令行创建django项目 不会自动新建templates模板文件夹,需要你自己手动创建 并且需要你自己去settings.py文件中注册该文件路径
pycharm快捷方式
创建Django项目
创建Django项目
一:
二:
(******)
创建的应用一定要在settings中注册 才能生效 否则无法识别
如果没有配置temlates路径也要手动添加
启动django项目
Django创建完成后的页面
django的主要文件夹介绍
项目名文件
同名的项目文件夹
settings.py django暴露给用户可配置的文件
urls.py 路由与视图函数对应关系
manage.py django入口文件
应用文件夹
migrations文件夹 数据库迁移记录
admin.py django后台管理
apps.py 应用注册相关
models.py orm模型类
tests.py 测试文件
views.py 视图函数
Django基础必备三件套:
from django.shortcuts import HttpResponse, render, redirect
HttpResponse
内部传入一个字符串参数,返回给浏览器。
例如:
与えます
リクエストパラメータに加えて、レンダリングされたデータ・ディクショナリ固有のパラメータを保存するテンプレートファイルを受け付けます。
データは、テンプレートファイルに充填し、最後にブラウザに結果を返します。(私たちはJinja2の上で使用したものと同様)
例えば:
リダイレクト
指定されたURL(リダイレクト)へのジャンプを示すURLパラメータを受け入れます。
例えば: