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

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

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

import socket

def index():
with open('D:\pythontext\9_15\index.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(b'HTTP/1.1 200 OK\r\n\r\n')
conn.send(send2.encode())

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

b'GET /index 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; Win64; x64)
AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.132 Safari/537.36\r\n
Sec-Fetch-Mode: navigate\r\n
Sec-Fetch-User: ?1\r\nAccept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3\r\n
Sec-Fetch-Site: none\r\nAccept-Encoding: gzip, deflate, br\r\nAccept-Language: zh-CN,zh;q=0.9,en;q=0.8\r\n\r\n'

·  通过切割的方法获取到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:\\Users\\xin\\AppData\\Roaming', 'COMMONPROGRAMFILES': 'C:\\Program Files\\Common Files', 'COMMONPROGRAMFILES(X86)': 'C:\\Program Files (x86)\\Common Files', 'COMMONPROGRAMW6432': 'C:\\Program Files\\Common Files', 'COMPUTERNAME': 'DESKTOP-V7OFSTO', 'COMSPEC': 'C:\\Windows\\system32\\cmd.exe', 'DRIVERDATA': 'C:\\Windows\\System32\\Drivers\\DriverData', 'FPS_BROWSER_APP_PROFILE_STRING': 'Internet Explorer', 'FPS_BROWSER_USER_PROFILE_STRING': 'Default', 'HOMEDRIVE': 'C:', 'HOMEPATH': '\\Users\\xin', 'LOCALAPPDATA': 'C:\\Users\\xin\\AppData\\Local', 'LOGONSERVER': '\\\\DESKTOP-V7OFSTO', 'NUMBER_OF_PROCESSORS': '', 'ONEDRIVE': 'C:\\Users\\xin\\OneDrive', 'ONEDRIVECONSUMER': 'C:\\Users\\xin\\OneDrive', 'OS': 'Windows_NT', 'PATH': 'D:\\python3.6\\Scripts\\;D:\\python3.6\\Scripts;D:\\python3.6\\;C:\\Windows\\system32;C:\\Windows;C:\\Windows\\System32\\Wbem;C:\\Windows\\System32\\WindowsPowerShell\\v1.0\\;C:\\Windows\\System32\\OpenSSH\\;F:\\DAL;C:\\Program Files\\Intel\\Intel(R) Management Engine Components\\DAL;D:\\python2.7\\Scripts;D:\\python2.7\\;D:\\mysql\\mysql-5.6.45-winx64\\bin;C:\\Users\\xin\\AppData\\Local\\Microsoft\\WindowsApps;', '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': '', 'PROCESSOR_REVISION': '3d04', 'PROGRAMDATA': 'C:\\ProgramData', 'PROGRAMFILES': 'C:\\Program Files', 'PROGRAMFILES(X86)': 'C:\\Program Files (x86)', 'PROGRAMW6432': 'C:\\Program Files', 'PSMODULEPATH': 'C:\\Program Files\\WindowsPowerShell\\Modules;C:\\Windows\\system32\\WindowsPowerShell\\v1.0\\Modules', 'PUBLIC': 'C:\\Users\\Public', 'PYCHARM_HOSTED': '', 'PYCHARM_MATPLOTLIB_PORT': '', 'PYTHONIOENCODING': 'UTF-8', 'PYTHONPATH': 'D:\\python编译器\\PyCharm 2018.1.4\\helpers\\pycharm_matplotlib_backend;D:\\pythontext\\9_15', 'PYTHONUNBUFFERED': '', 'SESSIONNAME': 'Console', 'SYSTEMDRIVE': 'C:', 'SYSTEMROOT': 'C:\\Windows', 'TEMP': 'C:\\Users\\xin\\AppData\\Local\\Temp', 'TMP': 'C:\\Users\\xin\\AppData\\Local\\Temp', 'USERDOMAIN': 'DESKTOP-V7OFSTO', 'USERDOMAIN_ROAMINGPROFILE': 'DESKTOP-V7OFSTO', 'USERNAME': 'xin', 'USERPROFILE': 'C:\\Users\\xin', 'WINDIR': 'C:\\Windows', 'SERVER_NAME': 'DESKTOP-V7OFSTO', 'GATEWAY_INTERFACE': 'CGI/1.1', 'SERVER_PORT': '', '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': '', '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/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3', 'HTTP_SEC_FETCH_SITE': 'none', 'HTTP_ACCEPT_ENCODING': 'gzip, deflate, br', 'HTTP_ACCEPT_LANGUAGE': 'zh-CN,zh;q=0.9,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':''}
with open(r'D:\pythontext\9_15\template\user.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='',
database='test',
autocommit=True
)
cursor = conn.cursor(
pymysql.cursors.DictCursor
)
sql = 'select * from user'
with open(r'D:\pythontext\9_15\template\get_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.一定记得清浏览器的缓存  

  在创建好app之后需要在settings中注册。

    INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
# 'app01' # 简写
'app01.apps.App01Config' # 全称
]

  其中的是app中的某个函数 。  

  django中的各个文件中的作用。

  应用名

    migrations    数据库迁移记录相关数据

    admin.py    django后台管理相关

    models.py   模型表相关

    views.py     视图函数相关

  项目名

    settings.py   配置文件

    urls.py   路由与视图函数的映射关系

    templates   项目用到的所有的html文件

    manage.py    django入口文件

七。django返回的三种状态。

  1.httpresponse

    返回字符串。

  2.render

    返回一个html

    这种方式可以给页面传值,以字典的方式。

def reg(request):
user_dict = {'name':'jason','password':''}
return render(request,'reg.html',{'user_dict':user_dict})

  3.redirect 重定向

  将页面跳转到另一页面

day51_9_15_Django的更多相关文章

随机推荐

  1. Python xlwt 写Excel相关操作记录

    1.安装xlwt pip install xlwt 2.写Excel必要的几步 import xlwt book = xlwt.Workbook() #创建一个workbook,无编码设置编码book ...

  2. Python 获 Mozilla 和扎克伯格夫妇 40 余万美金资助

    Python 软件基金会近日发文宣布,收到来自 Mozilla Corporation 和 Chan Zuckerberg Initiative(CZI)的资金赞助,共计 407,000 美元.这笔款 ...

  3. WPF 精修篇 窗体唯一(Single) 显示在最前

    原文:WPF 精修篇 窗体唯一(Single) 显示在最前 只运行一个窗体 并在一次点击时 显示到最前 发现用 SetForegroundWindow 并不是稳定的有效 最后使用 SetWindowP ...

  4. 跟着高淇学Python——第一到第三章总结

    2019/10/26 第一章:Python介绍 Python是一种解释型,面向对象的语言.特点是: 可读性强 简洁,简洁 面向对象 免费开源 可移植性和跨平台性 丰富的库 可扩展性 应用范围:1.人工 ...

  5. JS实现根据两点位置的经纬度获取距离

    // 经纬度转换成三角函数中度分表形式. function rad(d) { return d * Math.PI / 180.0; } // 根据经纬度计算距离,参数分别为第一点的纬度,经度:第二点 ...

  6. Define the Data Model and Set the Initial Data 定义数据模型并设置初始数据

    This topic describes how to define the business model and the business logic for WinForms and ASP.NE ...

  7. RPA之AA

    RoboticProcessAutomation(即机器人流程自动化),RPA机器人能够模仿大多数人类用户的行为, 比如可以登录应用程序,移动文件和文件夹,复制和粘贴数据,填写表单,从文档中提取结构化 ...

  8. Element-ui中ElScrollBar组件滚动条的使用

    在翻看 element-ui官网的文档时,发现其左侧导航和右边的内容超出屏幕时,滚动条的样式比较小巧,通过浏览器审查工具查看,发现它是使用了el-scrollbar的样式,跟element-ui的组件 ...

  9. 区块链社交APP协议分析:Qbao

    - Qbao是什么 - Qbao报文情况 本节我们开始使用Qbao软件,并抓取其报文进行分析. 对APP进行协议分析抓包的一般过程是: 1.打开抓包APP进行抓包: 2.打开APP开始使用: 3.对每 ...

  10. ucoreOS_lab8 实验报告

    所有的实验报告将会在 Github 同步更新,更多内容请移步至Github:https://github.com/AngelKitty/review_the_national_post-graduat ...