加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Python > 正文

day51_9_15_Django

发布时间:2020-12-20 10:42:53 所属栏目:Python 来源:网络整理
导读:一。pycharm接受网页信息原理。 如何实现在后端接受浏览器的数据,并解析出有用的信息呢? 使用socket编写网络连接,然后通过浏览器访问ip+端口号。 import socket def index(): with open( ‘ D:pythontext9_15index.html ‘ , ‘ r ‘ ) as f: date = f

一。pycharm接受网页信息原理。

  如何实现在后端接受浏览器的数据,并解析出有用的信息呢?

  使用socket编写网络连接,然后通过浏览器访问ip+端口号。

import socket


def index():
    with open(D:pythontext9_15index.html,r) as f:
        date = f.read()
    return date

def dee():
    return dee

dict1 = {/index:index,/dee:dee}
server = socket.socket()
server.bind((127.0.0.1,8080))
server.listen(5)

while True:
    conn,addr = server.accept()
    date = conn.recv(1024)
    print(date)
    date = date.decode()
    date = date.split( )
    print(date)
    if date[1] in dict1:
        send2 = dict1.get(date[1])()
    else:
        send2 = _
    conn.send(bHTTP/1.1 200 OKrnrn)
    conn.send(send2.encode())

  打印代码可以看到返回信息:

bGET /index HTTP/1.1rn
Host: 127.0.0.1:8080rn
Connection: keep-alivern
Cache-Control: max-age=0rn
Upgrade-Insecure-Requests: 1rn
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64)
AppleWebKit/537.36 (KHTML,like Gecko) Chrome/76.0.3809.132 Safari/537.36rn
Sec-Fetch-Mode: navigatern
Sec-Fetch-User: ?1rnAccept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3rn
Sec-Fetch-Site: nonernAccept-Encoding: gzip,deflate,brrnAccept-Language: zh-CN,zh;q=0.9,en;q=0.8rnrn

·  通过切割的方法获取到get后面的路由,再由语句判断执行相应的返回函数,再返回该值的二进制。

补充:

  在二进制和字符之间转化时,除了使用函数:

  encode()

  decode? ()

  之外,还可以使用以下形式:

data = str(data,encoding=utf-8)

data = bytes(data,encoding=utf-8)

二。wsgiref模块的使用。

  wsgiref模块讲网页传入的socket过程封装,将数据的发送与接受封装,程序员只要编写路由和视图的对应关系,执行相应的函数即可。

  

?

?

?  其中urls存放的就是路由和视图的对应关系,而wsgiref1存放的是运行代码。views存放的是视图函数。

  wsgiref的启动函数:

if __name__ == __main__:
    server = make_server(127.0.0.1,8080,run)
    server.serve_forever()

  其中make_server将ip+host接受,然后运行run函数。

  run中会被传入两个参数:env和response。

  env包括网页的一些重要信息其中包括路由:PATH_INFO,使用的存储方式就是字典。

  run从字典中解析出PATH_INFO就可以写入urls,执行相应的函数。

  response的函数方法:

response(200 OK,[])

  总代码:

from wsgiref.simple_server import make_server

def run(env,response):
    print(env)
    response(200 OK,[])
    curruct_path = env.get(PATH_INFO)
    func = None
    for url in urls:
        if url[0] == curruct_path:
            func = url[1]
            break
    if func:
        res = func(env)
    else:
        res = error(env)
    return [res.encode()]

  env中的kv键:

{ALLUSERSPROFILE: C:ProgramData,APPDATA: C:UsersxinAppDataRoaming,COMMONPROGRAMFILES: C:Program FilesCommon Files,COMMONPROGRAMFILES(X86): C:Program Files (x86)Common Files,COMMONPROGRAMW6432: C:Program FilesCommon Files,COMPUTERNAME: DESKTOP-V7OFSTO,COMSPEC: C:Windowssystem32cmd.exe,DRIVERDATA: C:WindowsSystem32DriversDriverData,FPS_BROWSER_APP_PROFILE_STRING: Internet Explorer,FPS_BROWSER_USER_PROFILE_STRING: Default,HOMEDRIVE: C:,HOMEPATH: Usersxin,LOCALAPPDATA: C:UsersxinAppDataLocal,LOGONSERVER: \DESKTOP-V7OFSTO,NUMBER_OF_PROCESSORS: 4,ONEDRIVE: C:UsersxinOneDrive,ONEDRIVECONSUMER: C:UsersxinOneDrive,OS: Windows_NT,PATH: D:python3.6Scripts;D:python3.6Scripts;D:python3.6;C:Windowssystem32;C:Windows;C:WindowsSystem32Wbem;C:WindowsSystem32WindowsPowerShellv1.0;C:WindowsSystem32OpenSSH;F:DAL;C:Program FilesIntelIntel(R) Management Engine ComponentsDAL;D:python2.7Scripts;D:python2.7;D:mysqlmysql-5.6.45-winx64bin;C:UsersxinAppDataLocalMicrosoftWindowsApps;,PATHEXT: .COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH;.MSC;.PY;.PYW,PROCESSOR_ARCHITECTURE: AMD64,PROCESSOR_IDENTIFIER: Intel64 Family 6 Model 61 Stepping 4,GenuineIntel,PROCESSOR_LEVEL: 6,PROCESSOR_REVISION: 3d04,PROGRAMDATA: C:ProgramData,PROGRAMFILES: C:Program Files,PROGRAMFILES(X86): C:Program Files (x86),PROGRAMW6432: C:Program Files,PSMODULEPATH: C:Program FilesWindowsPowerShellModules;C:Windowssystem32WindowsPowerShellv1.0Modules,PUBLIC: C:UsersPublic,PYCHARM_HOSTED: 1,PYCHARM_MATPLOTLIB_PORT: 51431,PYTHONIOENCODING: UTF-8,PYTHONPATH: D:python编译器PyCharm 2018.1.4helperspycharm_matplotlib_backend;D:pythontext9_15,PYTHONUNBUFFERED: 1,SESSIONNAME: Console,SYSTEMDRIVE: C:,SYSTEMROOT: C:Windows,TEMP: C:UsersxinAppDataLocalTemp,TMP: C:UsersxinAppDataLocalTemp,USERDOMAIN: DESKTOP-V7OFSTO,USERDOMAIN_ROAMINGPROFILE: DESKTOP-V7OFSTO,USERNAME: xin,USERPROFILE: C:Usersxin,WINDIR: C:Windows,SERVER_NAME: DESKTOP-V7OFSTO,GATEWAY_INTERFACE: CGI/1.1,SERVER_PORT: 8080,REMOTE_HOST: ‘‘,CONTENT_LENGTH: ‘‘,SCRIPT_NAME: ‘‘,SERVER_PROTOCOL: HTTP/1.1,SERVER_SOFTWARE: WSGIServer/0.2,REQUEST_METHOD: GET,PATH_INFO: /index,QUERY_STRING: ‘‘,REMOTE_ADDR: 127.0.0.1,CONTENT_TYPE: text/plain,HTTP_HOST: 127.0.0.1:8080,HTTP_CONNECTION: keep-alive,HTTP_CACHE_CONTROL: max-age=0,HTTP_UPGRADE_INSECURE_REQUESTS: 1,HTTP_USER_AGENT: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML,like Gecko) Chrome/76.0.3809.132 Safari/537.36,HTTP_SEC_FETCH_MODE: navigate,HTTP_SEC_FETCH_USER: ?1,HTTP_ACCEPT: text/html,application/signed-exchange;v=b3,HTTP_SEC_FETCH_SITE: none,HTTP_ACCEPT_ENCODING: gzip,br,HTTP_ACCEPT_LANGUAGE: zh-CN,en;q=0.8,wsgi.input: <_io.BufferedReader name=844>,wsgi.errors: <_io.TextIOWrapper name=<stderr> mode=w encoding=UTF-8>,wsgi.version: (1,0),wsgi.run_once: False,wsgi.url_scheme: http,wsgi.multithread: True,wsgi.multiprocess: False,wsgi.file_wrapper: <class wsgiref.util.FileWrapper>}
kv

三。静态页面和动态页面

  静态网页:

    页面上的数据都是写死的,万年不变

  动态网页:

    页面上的数据是从后端动态获取的

    比如后端获取当前时间

    后端获取数据库数据然后传递给前端页面。

  所以,模拟动态页面,需要先写一个页面,使用$$time字符占位时间,再通过函数替换字符为时间。

  (传递页面==》页面渲染)

  添加功能。如何将字典动态的添加到页面循环,并使用点方法取值。

四。jinja2的使用

  下载jinja2:pip3 install jinja2

  flask是依赖于jinja2,所以下载flask也可以下载jinja2。

  jinja2可以将模板(html页面)中的后端数据进行处理,将字典变成拥有点方法和字典取值方法的数据,其语法如下:

from jinja2 import Template
def get_user(env):
    user_dic = {name:lzx,pwd:123}
    with open(rD:pythontext9_15templateuser.html,r) as f:
        date = f.read()
    temp = Template(date)
    res = temp.render(date = user_dic)
    return res

  显示的页面如下

{{date}}}
{{date.name}}
{{date[name]}}
{{date.get(name)}}

  jinja2动态展示数据库:

import pymysql
def get_db(env):
    conn = pymysql.connect(
        host=127.0.0.1,port=3306,charset=utf8,user=root,password=123456,database=test,autocommit=True
    )
    cursor = conn.cursor(
        pymysql.cursors.DictCursor
    )
    sql = select * from user
    with open(rD:pythontext9_15templateget_db.html,r) as f:
        date1 = f.read()
    date2 = cursor.execute(sql)
    date = cursor.fetchall()
    temp = Template(date1)
    res = temp.render(user_list=date)
    return res

  模板:

{% for user_dict in user_list%}
                        <tr>
                            <td>{{user_dict.id}}</td>
                            <td>{{user_dict.name}}</td>
                            <td>{{user_dict.pwd}}</td>
                        </tr>
                    {%endfor%}

  如此得出web流程图:

?

?

?

?五。web框架。

  python中有三大主流web框架

    Django:大而全,自带了很多功能模块,类似于航空母舰 (缺点:有点笨重)

    Flask:短小精悍,自带的功能模块特别少,大部分都是依赖于第三方模块(小而轻)

      flask框架第三方发组件特别多,加起来可以抵过django

    Tornado:异步非阻塞 主要用在处理高io 多路复用的情况 可以写游戏后端

?

      速度快。

a:socket
b:路由与视图函数
c:模板渲染

Django:
a用的别人的 wsgiref
b自己写的
c自己写的
Flask:
a用的别人的 werkzeug
b自己写的
c用的别人的 jinja2
Tornado:
a,b,c都是自己写的

六。Django框架:

  使用注意事项:

    1.计算机的名称不能有中文

    2.一个pycharm窗口就是一个项目,不要多个项目放在一个窗口里面

    3.项目名不能起中文

  关于版本:

    推荐使用1.11.11版本

  

创建django项目的方式方式1(命令行创建): 创建django项目 django-admin startproject 项目名 创建app应用 python3 manage.py startapp app01 启动django项目 python3 manage.py runserver ps:用命令行创建django默认不会自动创建templates文件夹 需要你手动自己创建(注意改文件夹路径是否被添加配置文件中) 方式2(pycharm创建) FILE >>> new project 选择第二个django 需要注意名字不能有中文,选择本地的解释器,勾选后台管理 创建app pycharm命令行创建 python3 manage.py startapp app01 Tools下面run manage task功能栏 启动点小绿色箭头 强调: 1.用django一定要保证只有一个在运行状态 切记切记!!!!!!! 2.一定记得清浏览器的缓存

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读