"""根据URL中不同的路径返回不同的内容--函数进阶版返回HTML页面让网页动态起来"""import socketimport timesk = socket.socket()sk.bind(("127.0.0.1",8080)) # 绑定IP和端口sk.Listen() # 监听# 将返回不同的内容部分封装成函数def index(url): with open("index.HTML","r",enCoding="utf8") as f: s = f.read() Now = str(time.time()) s = s.replace("@@[email protected]@",Now) # 在网页中定义好特殊符号,用动态的数据去替换提前定义好的特殊符号 return bytes(s,enCoding="utf8")def home(url): with open("home.HTML",enCoding="utf8") as f: s = f.read() return bytes(s,enCoding="utf8")# 定义一个url和实际要执行的函数的对应关系List1 = [ ("/index/",index),("/home/",home),]while 1: # 等待连接 conn,add = sk.accept() data = conn.recv(8096) # 接收客户端发来的消息 # 从data中取到路径 data = str(data,enCoding="utf8") # 把收到的字节类型的数据转换成字符串 # 按\r\n分割 data1 = data.split("\r\n")[0] url = data1.split()[1] # url是我们从浏览器发过来的消息中分离出的访问路径 conn.send(b‘http/1.1 200 OK\r\n\r\n‘) # 因为要遵循http协议,所以回复的消息也要加状态行 # 根据不同的路径返回不同内容 func = None # 定义一个保存将要执行的函数名的变量 for i in List1: if i[0] == url: func = i[1] break if func: response = func(url) else: response = b"404 not found!" # 返回具体的响应消息 conn.send(response) conn.close()自定义web框架 wsgiref
我们利用wsgiref模块来替换我们自己写的web框架的socket server部分:
"""根据URL中不同的路径返回不同的内容--函数进阶版返回HTML页面让网页动态起来wsgiref模块版"""import timefrom wsgiref.simple_server import make_server# 将返回不同的内容部分封装成函数def index(url): with open("index.HTML",enCoding="utf8") as f: s = f.read() Now = str(time.time()) s = s.replace("@@[email protected]@",Now) return bytes(s,]def run_server(environ,start_response): start_response(‘200 OK‘,[(‘Content-Type‘,‘text/HTML;charset=utf8‘),]) # 设置http响应的状态码和头信息 url = environ[‘PATH_INFO‘] # 取到用户输入的url func = None for i in List1: if i[0] == url: func = i[1] break if func: response = func(url) else: response = b"404 not found!" return [response,]if __name__ == ‘__main__‘: httpd = make_server(‘127.0.0.1‘,8090,run_server) print("我在8090等你哦...") httpd.serve_forever()使用wsgiref编写的框架 jinja2
上面的代码实现了一个简单的动态,我完全可以从数据库中查询数据,然后去替换我HTML中的对应内容,然后再发送给浏览器完成渲染。 这个过程就相当于HTML模板渲染数据。 本质上就是HTML内容中利用一些特殊的符号来替换要展示的数据。 我这里用的特殊符号是我定义的,其实模板渲染有个现成的工具: jinja2
pip install jinja2
<!DOCTYPE HTML><HTML lang="zh-CN"><head> <Meta charset="UTF-8"> <Meta http-equiv="x-ua-compatible" content="IE=edge"> <Meta name="vIEwport" content="wIDth=device-wIDth,initial-scale=1"> <Title>Title</Title></head><body> <h1>姓名:{{name}}</h1> <h1>爱好:</h1> <ul> {% for hobby in hobby_List %} <li>{{hobby}}</li> {% endfor %} </ul></body></HTML>index2.HTML文件jinjia2HTML
使用jinja2渲染index2.HTML文件:
from wsgiref.simple_server import make_serverfrom jinja2 import Templatedef index(): with open("index2.HTML","r") as f: data = f.read() template = Template(data) # 生成模板文件 ret = template.render({"name": "Alex","hobby_List": ["烫头","泡吧"]}) # 把数据填充到模板里面 return [bytes(ret,enCoding="utf8"),]def home(): with open("home.HTML","rb") as f: data = f.read() return [data,]# 定义一个url和函数的对应关系URL_List = [ ("/index/",]) # 设置http响应的状态码和头信息 url = environ[‘PATH_INFO‘] # 取到用户输入的url func = None # 将要执行的函数 for i in URL_List: if i[0] == url: func = i[1] # 去之前定义好的url列表里找url应该执行的函数 break if func: # 如果能找到要执行的函数 return func() # 返回函数的执行结果 else: return [bytes("404没有该页面",]if __name__ == ‘__main__‘: httpd = make_server(‘‘,8000,run_server) print("Serving http on port 8000...") httpd.serve_forever()使用jinja2渲染index2.HTML文件
Django 下载(安装带有LTS标识的版本,LTS表示持续更新维护)
官网:https://www.djangoproject.com/download/
命令:
pip3 install django==1.11.11创建Django项目
django-admin startproject mysiteDjango目录介绍
mysite/├── manage.py # 管理文件└── mysite # 项目目录 ├── __init__.py ├── settings.py # 配置 ├── urls.py # 路由 --> URL和函数的对应关系 └── wsgi.py # runserver命令就使用wsgiref模块做简单的web server运行Django
python manage.py runserver 127.0.0.1:8000模板文件配置
TEMPLATES = [ { ‘BACKEND‘: ‘django.template.backends.django.DjangoTemplates‘,‘Dirs‘: [os.path.join(BASE_DIR,"template")],# template文件夹位置 ‘APP_Dirs‘: True,‘OPTIONS‘: { ‘context_processors‘: [ ‘django.template.context_processors.deBUG‘,‘django.template.context_processors.request‘,‘django.contrib.auth.context_processors.auth‘,‘django.contrib.messages.context_processors.messages‘,],},]静态文件配置
STATIC_URL = ‘/static/‘ # HTML中使用的静态文件夹前缀STATICfileS_Dirs = [ os.path.join(BASE_DIR,"static1"),# 静态文件存放位置 os.path.join(BASE_DIR,"static2"),]# 静态文件路径有可以有多个,按照顺序查找# 例子:/static/index.CSS 如果index.CSS在static2中,会先查找static1中有没有,如果1中没有,去static2中查找,找到后返回。Django基础模块
from django.shortcuts import httpResponse,render,redirect1.httpResponse
内部传入一个字符串参数,返回给浏览器。
例如:
def index(request): # 业务逻辑代码 return httpResponse("OK")2.render
除request参数外还接受一个待渲染的模板文件和一个保存具体数据的字典参数。
将数据填充进模板文件,最后把结果返回给浏览器。(类似于我们上面用到的jinja2)
例如:
def index(request): # 业务逻辑代码 return render(request,"index.HTML",{"name": "alex","hobby": ["烫头","泡吧"]})3.redirect
接受一个URL参数,表示跳转到指定的URL。
例如:
def index(request): # 业务逻辑代码 return redirect("/home/")总结
以上是内存溢出为你收集整理的Django项目的创建和启动全部内容,希望文章能够帮你解决Django项目的创建和启动所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)