day51_9_15_Django
一。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的更多相关文章
随机推荐
- Day6 - Python基础6 模块shelve、xml、re、subprocess、pymysql
本节目录: 1.shelve模块 2.xml模块 3.re模块 4.subprocess模块 5.logging模块 6.pymysql 1.shelve 模块 shelve模块是一个简单的k,v将内 ...
- poj 3070 矩阵计算Fibonacci
地址 http://poj.org/problem?id=3070 大意是输入一个数字 输出位于Fibonacci数列该位置的数字模10000的结果 由于n比较大 0 ≤ n ≤ 1,000,000, ...
- html和css常见问题解答
1. 详细描述层叠和继承的概念. 元素内嵌样式(用元素的全局属性style定义的样式) 文档内嵌样式(定义在style元素中的样式) 外部样式(用link元素导入的样式) 用户样式(用户定义的样式) ...
- 【ECNU71】一个游戏(水题)
点此看题面 大致题意: \(n\)种元素,有若干组将\(x\)元素转化为\(y\)元素的操作.问对于所有可能的元素拥有状况,改变转化操作的顺序,是否会影响转化后最终的结果. 水题 虽说是这么水的题,但 ...
- 用Python做个海量小姐姐素描图
素描作为一种近乎完美的表现手法有其独特的魅力,随着数字技术的发展,素描早已不再是专业绘画师的专利,今天这篇文章就来讲一讲如何使用python批量获取小姐姐素描画像.文章共分两部分: 第一部分介绍两种使 ...
- Windows安装与配置—MongoDB
1,下载安装 打开下载链接:http://dl.mongodb.org/dl/win32/x86_64,选择后缀是2008plus-ssl-3.6.15.zip的版本,32位和64位通用. 2,安装配 ...
- 拎壶学python3-----(1)输出与字符转换
一.输入自己的名字打印 二.数字和字符串是不能相加的如下 怎么解决上边的问题呢? 如果是相加我们要把字符串转成数字类型如下 如果不想让他相加可以写成这样如下: ok,关于转换就先讲到这里
- 企业如何做好B2C电商平台
导语本文主要讲了两个方面:1.企业如何定位B2C电商平台:2.企业做B2C遇到的问题. 一.企业如何定位B2C电商平台传统企业做B2C电子商务一般选用品牌.渠道.平台模式这三种,品牌模式是在网上建立一 ...
- 下载文件旁边附的MD5/SHA256等有什么用途?
在我们下载很多软件时,旁边会出现md5,sha1/sha256/sha512等一长串字符串,这些字符串是什么意义呢? 因为怕盗版或者怕软件被植入病毒或者插件等,要对软件的完整性做校验.步骤:先下载完软 ...
- HikariCP监控指标介绍和应用
概述 HikariCP提供了一些监控指标,他的监控指标都是基于MicroMeter提供出来的,然后支持Prometheus和Dropwizard.本次我们将讨论一下HikariCp的监控指标有哪些,为 ...