フレームワークの基礎をjdango

ディレクトリ

jdangoフレームワーク

ソフトウェア開発のアーキテクチャ:

C / Sアーキテクチャ

B / Sアーキテクチャ(本質的には、C / Sです)

ウェブバックエンド

需要
異なるコンテンツを返すためのユーザ入力異なるサフィックスに従って1.
httpプロトコルの形式に合わせてユーザサフィックスデータから入力を取得する
欠陥
の我々自身のコード書く1.socket
、処理我々自身のデータ2.httpを
HTTPプロトコル

1. 4つの特性:

- 要求応答に基づいて、

- TCP / IPベースのプロトコルは、アプリケーション層の上部に適用されます

- ステートレス

本契約は、訪問の最後に限り、次回、またはアクセスするか、新しい状態とクリアされます

- 接続なし

2.データ・フォーマット

リクエストフォーマット:

要求(リクエストメソッド、プロトコルバージョン)の最初の行
要求ヘッダー(キーと値のペアのKVの束)

中級空白行 "

リクエストボディ

3.応答ステータスコード

図面と示唆的な情報の束を表示します

各企業は、独自の応答ステータスコードを定義することができます

1XX:サーバは、クライアントのデータを正常に受信しているが、処理されている、あなたが提出し続けることができます

2XX:200あなたがしたいサーバーが正常に戻ってきたデータを要求します

3XX:リダイレクション(もともと訪問したかったが、Aは、自動的にあなたがBの上に行く与える内側)

4XX:404要求されたリソースが存在しない、あなたは条件にリソースを403要求を持っていません

5XX:500内部サーバーエラー

需要
ユーザ入力サフィックスリターン異なる内容によっては1.
httpプロトコル形式からユーザーの入力に取得サフィックスデータ準拠

不十分な

私たち自身のコード記述1.socket
も2.http当社独自のデータ処理を

import socket


server = socket.socket()
server.bind(('127.0.0.1',8080))
server.listen(5)
"""
请求首行
b'GET / HTTP/1.1\r\n
请求头
Host: 127.0.0.1:8080\r\n
Connection: keep-alive\r\n
Cache-Control: max-age=0\r\n
Upgrade-Insecure-Requests: 1\r\n
User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.80 Safari/537.36\r\n
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3\r\n
Accept-Encoding: gzip, deflate, br\r\n
Accept-Language: zh-CN,zh;q=0.9\r\n
\r\n
请求体
'

"""

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')  # bytes变成一串字符串
    target_url = data.split('\r\n')[0].split(' ')[1]
    # 判断url返回响应的内容即可
    if target_url == '/index':
        # conn.send(b'index')
        with open(r'D:\上海校区python13期视频\day49\01 demo.html','rb') as f:
            conn.send(f.read())
    elif target_url == '/login':
        conn.send(b'login')
    else:
        conn.send(b'404 error')
    conn.close()

3. wsgirefモジュールラインに基づいており、
異なる機能に応じて異なるファイルに分割
適切なリソースを取得することができたブラウザウィンドウでユーザーを、URLを入力すると、
対応するリソース・インタフェースのバックエンドので、すでにオープンしています

基于wsgiref模块以及文件拆分的特点
    只要你想要开设新的资源
        1.先在urls文件中写url与函数的对应关系
        2.再去views文件中写对应的函数

urls.py:路由与视图函数的对应关系
views.py:里面就是放的一堆视图函数(视图函数可以是函数也可以是类)
templates文件夹:里面放的就是一堆html文件(模板文件夹)

動的および静的なページを
静的ページ
のデータを同じ年に書かれて死んで
ダイナミックなウェブ
データが動的に取得された
EGを:
1.現在の時刻を取得し
、データベースからデータを取得する2

需要
1.あなたは私のショーは、現在訪問された後、直ちにアクセスとの間の対応を書き込むための時間を与えます

2.后端有一个用户字典 你需要将该字典传递给html页面 并且在该页面上还可以将传递过来的数据当成字典数据进行获取值的操作

Jinja2のモジュールは
PythonのHTMLページがデータ(テンプレート構文)を操作するように、バックエンドに書き込むことができるコードを提供
PIP3 Jinja2のをインストールし
ますので、ちょうどフラスコ枠組みの下で、フラスコフレームテンプレートの構文はJinja2のモジュールで自動的にダウンロードJinja2の

模板语法(jinja2模板语法非常贴近python语法 但是并不是所有的框架使用的都是jinja模板语法)
{{ xxx }}
<p>{{xxx.username}}</p>
<p>{{xxx['password']}}</p>
<p>{{xxx.get('hobby')}}</p>
<p>{{xxx.get('hobby')[0]}}</p>
<p>{{xxx.get('hobby').1}}</p>


{XXX%でuser_dict用%} {{user_dict.id}} 、{{user_dict.name}} 、{{user_dict.hobby}} {%ENDFOR%}





フロントページを表示するには、データベース内のデータを取得します

ベースのwsgirefモジュール

from wsgiref.simple_server import make_server
from views import *  #*代表的是导入所有的信息
from urls import urls


def run(env,response):
    """
    :param env: 请求相关的所有数据
    :param response: 响应相关的所有数据
    :return: 浏览器能够接受的内容
    """
    response('200 OK',[])
    # print(env)  # 大字典  里面的PATH_INFO参数就是用户输入的后缀
    target_url = env.get('PATH_INFO')
    # if target_url == '/index':
    #     # 一堆逻辑判断
    #     return [b'index']
    # elif target_url == '/login':
    #     return [b'login']
    # 先定义一个变量 用来存储可能匹配到的函数名
    func = None
    # 1 for循环获取一个个的url与函数对应关系的元组
    for url in urls:  # url = (),(),()
        # 2 判断当前用户访问的url与元组第一个元素是否一致
        if target_url == url[0]:
            # 3 如果相等 说明有对应的后端逻辑代码 将匹配到的函数名赋值给func
            func = url[1]
            # 4 一旦用户匹配上了响应的url 应该立刻结束当前for循环了 因为没有意义
            break
    # 针对func是否有值 还需要判断
    if func:
        # 匹配上了  加括号直接调用
        res = func(env)
    else:
        # 匹配404逻辑代码
        res = error(env)
    return [res.encode('utf-8')]  # 这个里面的res是view里面返回的,返回函数的返回值给浏览器 并且编码成bytes


if __name__ == '__main__':
    server = make_server('127.0.0.1',8080,run)
    # 监听127.0.0.1:8080 一旦有客户端来访问 会立刻将make_server第三个参数加括号调用执行
    server.serve_forever()  # 启动服务端

URLを

from views import *

urls = [
    ('/index',index),
    ('/login',login),
    ('/xxx',xxx),
    ('/get_time',get_time),
    ('/get_user',get_user),
    ('/get_info',get_info)
]

景色

def index(env):
    return 'index'

def login(env):
    return 'login'

def error(env):
    return '404 error'


def xxx(env):
    return 'xxx'

import time
def get_time(env):
    # 该函数需要返回一个html页面
    current_time = time.strftime('%Y-%m-%d %X')
    # 文件操作 读取html文件
    with open(r'D:\上海校区python13期视频\day49\templates\02 get_time.html','r',encoding='utf-8') as f:
        data = f.read()  # html文件内容  字符串
    data = data.replace('gfdgsfdgfdsgsfdgsfdgsfdgsdg',current_time)  # 利用字符串的替换
    return data

from jinja2 import Template
def get_user(env):
    user_dict = {'username':'jason','password':123,'hobby':['read','study','run']}
    with open(r'D:\上海校区python13期视频\day49\templates\03 get_user.html','r',encoding='utf-8') as f:
        data = f.read()
    temp = Template(data)
    res = temp.render(xxx=user_dict)  # 将user_dict传递给html页面 在页面上通过变量名xxx就能够获取到user_dict
    return res


import pymysql
def get_info(env):
    conn= pymysql.connect(
        host= '127.0.0.1',
        port= 3306,
        user= 'root',
        password= '123',
        database= 'mydjango',
        charset= 'utf8',
        autocommit = True #自动提交给mysql确认

    )
    cursor= conn.cursor(cursor=pymysql.cursors.DictCursor)#产生一个游标对象
    #cursor= pymsql.cursors.DictCursor 将查询的结果 做一个字典的形式返回
    sql= 'select * from user_info'
    cursor.execute(sql)#执行sql语句
    data = cursor.fetchall()  #获取查询结果的所有数据
    ##结果是是[{} ,{},{}]
    #讲列表套字典的结果数据,直接传递给html的页面上
    with open(r'','r', encoding='utf-8') as f:
        res = f.read()
    #利用jinja2模块
    tmp= Template(res)
    #利用对象render的方法,将数据直接传递给html页面
    res= tmp.render(xxx=data)
    return res

get_user.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.4.1/css/bootstrap.min.css" rel="stylesheet">
    <script src="https://cdn.bootcss.com/twitter-bootstrap/3.4.1/js/bootstrap.min.js"></script>
</head>
<body>
{{ xxx }}
<p>{{xxx.username}}</p>
<p>{{xxx['password']}}</p>
<p>{{xxx.get('hobby')}}</p>
<p>{{xxx.get('hobby')[0]}}</p>
<p>{{xxx.get('hobby').1}}</p>
</body>
</html>

get_info.hrml

<!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.4.1/css/bootstrap.min.css" rel="stylesheet">
    <script src="https://cdn.bootcss.com/twitter-bootstrap/3.4.1/js/bootstrap.min.js"></script>
</head>
<body>
<div class="container">
    <div class="row">
        <h2 class="text-center">数据展示</h2>
        <div class="col-md-8 col-md-offset-2">
            <table class="table-hover table table-striped">
                <thead>
                    <tr>
                        <th>id</th>
                        <th>username</th>
                        <th>hobby</th>
                    </tr>
                </thead>
                <tbody>
<!--                    xxx = [{},{},{},{}]-->
                {%for user_dict in xxx %}
                    <tr>
                        <td>{{ user_dict.id }}</td>
                        <td>{{ user_dict.name }}</td>
                        <td>{{ user_dict.hobby }}</td>
                    </tr>
                {% endfor %}
                </tbody>
            </table>
        </div>
    </div>
</div>
</body>
</html>

get_time.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.4.1/css/bootstrap.min.css" rel="stylesheet">
    <script src="https://cdn.bootcss.com/twitter-bootstrap/3.4.1/js/bootstrap.min.js"></script>
</head>
<body>
gfdgsfdgfdsgsfdgsfdgsfdgsdg
</body>
</html>

フロントページを取得するために、データベース内の4表示データ

1.ルーティングとビュー機能対応関係
2.ビュー機能
3.テンプレートフォルダ
4.テンプレート構文は(実施の後端部の前端部に認識されません)

Webフレームワーク

python 3つの主流のWebフレームワークは、
Djangoの
大型、特に大きな空母に似た独自の特殊なコンポーネントと機能運ぶ
欠点を:面倒を
あなたが他のいくつかの機能が機能の多くを使用する必要がある場合は、
フラスコを(ソースアプリケーションコンテキスト要求コンテキストの600以上の行)
小さいが上レンジャーズに似独自の特殊な特殊なコンポーネントと機能を運ぶ少ない
ものの、そのサードパーティのサポートが、特に、特にフレームワークの以下の機能モジュール
あなたオーバーレイすべてのサードパーティのモジュールをさらにジャンゴより最大フラスコ場合には
不備部門:サードパーティのモジュールに限定

tornado
    异步非阻塞
    天然支持高并发 甚至可以用它来开发游戏服务器

Djangoフレームワーク1.注意事項1.コンピュータ名が中国持つことができない中国人は使用しないでください。2.プロジェクトファイル名、別のウィンドウが完了したプロジェクトである。3. pycharmを2バージョンの問題1.X 2.Xは、あなたが内部のバージョン1.xを使用することをお勧めし1.11.13 - 1.11.09 以前のバージョンはアンインストールし、再インストールしてからインストールを自動的になり、手動でアンインストールする必要があるにわたって追跡した場合、インストール3. PIP3インストール== 1.11.11ジャンゴ4.テストが正常にインストールされているコマンドラインジャンゴ管理者

















如何创建django项目
    1.命令行
        1.创建django项目
            django-admin startproject mysite(项目名)
            效果:创建一个mysite的文件夹
                mysite
                    -mysite
                        --__init__.py
                        --settings.py
                        --urls.py
                        --wsgi.py
                    -manage.py
        2.启动django项目(先切换到项目目录下)
            python3 manage.py runserver # django默认的端口号是8000
        
        3.创建具有独立功能的app  通常情况下应该做到建明制衣 
            python manage.py startapp app01
                app01
                    --migrations文件夹
                    --__init__.py
                    --admin.py
                    --apps.py
                    --models.py
                    --tests.py
                    --views.py


「」 "
あなたが手動で自分自身を作成することができますタッチバージョンフォルダ1. Djangoプロジェクトを作成するためのコマンドラインが自動的に作成されていないテンプレート
プロジェクトジャンゴ2.コマンドラインをするだけでなく、設定ファイルがないフォルダテンプレートの作成に失敗しました。パスを記入
自動的に追加作成され、pycharm
"「」

    2.pycharm快捷创建
        
app的概念
    application 应用
    django其实是一个专注于开发app的web框架
    一个空的django项目就类似于是一所大学
    app就类似于大学里面的各个学院
    每个app其实就类似于不同的功能模块
        购物网站
            用户相关 user
                用户相关的app
            订单相关 order
                订单相关的app
            投诉相关 tousu
                投诉相关的app
    不同的功能模块推荐使用不同的app去开发
    django支持多app


バージョン3.7通訳のpythonを使用しないでください
あなたは3.6に3.4を使用することをお勧めします

ファイルDjangoの主な機能
個人用サイト
-mysite
- INITの.py
--settings.pyプロジェクトプロファイル
--urls.py総プロジェクトルートのビューの間で機能対応ルーティング
--wsgi.py
-manage.py
app01
--migrationsデータベースフォルダ変更レコード
---- のinitの.py
- INITの.py
--admin.py Djangoの管理
--apps.py登録アプリ関連
--models.pyモデルクラス(ORM)
--tests.pyテストファイル
--views .pyビュー機能(******)
app02
--migrationsフォルダデータベースの変更レコード
---- のinitの.py
- INITの.py
--admin.pyジャンゴ管理
関連--apps.py登録アプリ
- -models.pyモデルクラス(ORM)
--tests.pyテストファイル
--views.pyビュー機能(******)
Djangoは、テストのための小さなローカルデータベースに付属のdb.sqlite3(データの日付形式は非常に敏感ではありません)

簡単に間違い
コードが有効に変更されていない1.
サービスの数から1同一のポートは、サービスがの始まりであることを実行してきた
。2.ブラウザのキャッシュの問題

*************アプリを作成した後、ファイルの設定に行くを登録してください必要があります**********
Djangoが自動的に再起動することができますが、その再起動メカニズム
、それはあなたのコードを検出するたびに自動的に再起動します一定の時間間隔に変化がある
、時々あなたがコードを書いていないように見えることがあり、自動的に再起動されています

白になりますジャンゴ3軸
のHttpResponse
リターン文字列
描画
返されたHTMLページを、データをHTMLページに送信することができ
、レンダリングテンプレート(に配置された後端に対応する位置データをテンプレートのHTML構文)

redirect
    重定向

def index(request):
    return HttpResponse('你好啊 小妹妹')


def login(request):
    return render(request,'login.html',{'user_dict':{'username':'jason','password':123},'userxxx':'hello world'})


def home(request):
    # return redirect('https://www.mzitu.com')
    return redirect('/index')

login.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.4.1/css/bootstrap.min.css" rel="stylesheet">
    <script src="https://cdn.bootcss.com/twitter-bootstrap/3.4.1/js/bootstrap.js"></script>
</head>
<body>
<p>我的脑力正在不断的提高 非常棒的一件事情</p>
{{ user_dict }}
{{ user_dict.name }}


</body>
</html>

おすすめ

転載: www.cnblogs.com/bs2019/p/12153883.html