初识django
初识django
简易的web框架
首先,既然是一个web框架就一定少不了socket套接字,那就先搭建一个socket套接字,因为是个b/s的架构,所以只需要写一个服务端,客户端由浏览器充当
import socket
server = socket.socket()
server.bind(
('127.0.0.1',8080)
)
server.listen(5)
while True:
conn,addr = server.accept()
data = conn.recv(1024)
print(data)
# 让数据符合HTTP协议才能发送成功
conn.send(b'HTTP/1.1 200 ok\r\n\r\n')
conn.send(b'hello world')
conn.close()
# data的结果
'''
#请求首行,标识遵循的协议
b'GET /abc 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/76.0.3809.132 Safari/537.36\r\n
Sec-Fetch-Mode: navigate\r\n
Sec-Fetch-User: ?1\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
Sec-Fetch-Site: none\r\n
Accept-Encoding: gzip, deflate, br\r\n
Accept-Language: zh-CN,zh;q=0.9,en;q=0.8\r\n
Cookie:
csrftoken=IjRfRStHOgm6vLqz4cU1dsUcMmqXkvMfsYMdBSSwpogWO9qjWG2nkedlhdEI5gaQ\r\n
# 在请求头和请求体中间要有一个换行,需要注意,面试会问
\r\n'
# 请求体
'''
如果用户访问的页面的url变了,我们又怎么去根据用户的ur来返回相应的资源?所以我们首先就要得到用户访问的url,从我们答应的data 的结果中我们可以发现,在请求首行中带有用户访问的url,
我们得到的数据是二进制的格式,所以就要先转化成字符的格式
data_str = data.decode('utf-8')
把二进制转化成字符后,我们就可以根据/r/n切割成一个列表,因为是请求首行,所以去索引0就可以得到请求头,然后再通过空格切割,取索引1就可以得到我们想要的url后缀,得到这个后缀我们就可以知道用户所访问的url
current_path = data_str.split('/r/n')[0].split(' ')[1]
得到用户访问的url后我们就可以根据这个url进行判断,然后返回相应的数据
if current_path = '/index':
conn.send('index')
else:
conn.send(b'404 error')
在这个web框架中我们发现,这些东西的套路都是很固定的,如果换个人写也是差不多的,所以就一定会有一个模块来帮我i们做这件事,这个模块就是wsgiref,他能实现web服务网关接口,那么接下来就跟据这个函数来搭建
# wsgiref.py
from wsgiref.simple_server import make_server
from urls import urls
from views import *
def run(env,response):
"""
:param env: 请求相关的所有数据 将http数据全部提前处理成了字典的形式 供调用者使用
:param response: 响应相关的所有数据
:return: 给前端真正的数据
"""
# print(env)
response('200 OK',[('xxx','jason'),])
current_path = env.get('PATH_INFO')
func = None
for url in urls: # url = ('/login',login) ('/index',index)
if current_path == url[0]: # 用户敲的后缀名 你后端有对应的处理业务
func = url[1] # 将匹配上的函数名赋值给func变量
break # 一旦用户匹配上了对应的业务接口 立刻结束匹配
# 判断func是否被赋值
if func:
res = func(env)
else:
res = error(env)
return [res.encode('utf-8'),]
if __name__ == '__main__':
server = make_server('127.0.0.1',8080,run) # 实时监听本机8080端口
# 一旦有请求来了 会统一交给run函数处理(调用run函数并传参run(env,response))
server.serve_forever() # 启动服务端
# urls.py
from views import *
urls = [
('/login',login),
('/index',index),
('/reg',reg),
('/xxx',xxx),
('/get_time',get_time),
('/get_userdict',get_userdict),
('/get_data',get_data),
]
# views.py
def login(env):
return 'login'
def index(env):
return 'index'
def reg(env):
return 'reg'
def xxx(env):
# return 'xxx'
with open(r'templates/02 xxx.html','r',encoding='utf-8') as f:
return f.read()
def error(env):
return '404 error'
在这些文件里
views.py 存放的是视图函数
urls.py存放的是路由与视图函数的对应关系
python三大主流的web框架
-
django: 优点:这个框架的封装的东西很多,自带的功能非常多
缺点:比较笨重,比较适合写大一点的项目,小项目优点大材小用
-
flask:这个框架集成的东西不多,大部分依赖于第三方的模块,但是如果将所有的第三方模块加起来可能直接盖过django
-
tornado:基于异步非阻塞的思想开发,这个框架很快,甚至都可以用来开发游戏的服务器
django框架介绍
jango是一个以开发app为主要功能的web框架
app就是application应用的意思
一个django项目就是一所大学(空的架子 本身没有任何功能)
而app就类似于大学里面的各个学院
一个空的django本身没有任何作用 仅仅是为app提高前期的环境配置
你可以根据功能的不同 开发多个app
一个app对应一个具体的功能模块
用户相关的功能 用户相关的app
订单相关的功能 订单相关的app
商品相关的功能 商品相关的app
每一个app都有自己独立的功能
注意事项
- 计算机名称不能有中文
- python解释最好不要使用3.7,因为有bug没解决,最好使用3.4~3.6
- 一个pycharm窗口只能运行一个项目
django版本
目前,django版本是以1.11.11为主,最好不要使用最新版本的工具,可能不稳定,有很多bug
django安装
pip install Django == 1.11.11
或者在settings中安装
安装后,可以在命令行中输入django-admin
来判断是否安装成功
创建django项目
基于命令行创建项目
-
创建django项目:
django-admin startproject 项目名
-
启动django项目:注意要现切换到项目的目录下
python manage.py runserver
或者
python manage.py runserver 127.0.0.1:8080
指定端口 -
创建应用(app):
python manage.py startapp app01(应用名称)
在使用命令行的时候需要注意,
- 你存放HTML的文件templates文件夹不会自动创建
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
# 需要手动添加
'DIRS': [os.path.join(BASE_DIR, 'templates')],
'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',
],
},
},
]
- 创建好的应用需要在django配置文件中注册才能使用
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
# 'app01' # 简便写法
'app01.apps.App01Config' # 最完整的写法
]
通过pycharm创建
通过pycharm 创建比较简单,在pycharm中的文件选项选择新建django项目,然后填好项目的名称
通过pycharm可以默认新建一个app,填写app名称即可
和通过命令行创建一样,在新建app后也要先注册才可生效
django的项目目录
django给前端传输数据的三种方式
-
HttpResponse 返回字符串
-
render 返回html文件
可以给html页面传值def login(request) user_dic = {'username':'jason','password':'123' return render(request,'login.html',{'xxx':user_dic}
-
redirect 重定向
1.直接写你本网站的路径后缀
2.也可以全路径def home(request) # return redirect('/login') # 重定向 return redirect('https://www.baidu.com') # 重定向