位置: IT常识 - 正文

Python开发自定义Web框架(python创建自定义函数)

编辑:rootadmin
Python开发自定义Web框架

推荐整理分享Python开发自定义Web框架(python创建自定义函数),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:python编写自定义函数,python编写自定义函数,python如何运行自定义函数,python编写自定义函数,python中创建自定义函数的语法规范,python自定义数据操作,python自定义数据操作,python如何运行自定义函数,内容如对您有帮助,希望把文章链接给更多的朋友!

文章目录开发自定义Web框架1.开发Web服务器主体程序2.开发Web框架主体程序3.使用模板来展示响应内容4.开发框架的路由列表功能5.采用装饰器的方式添加路由6.电影列表页面的开发案例开发自定义Web框架

接收web服务器的动态资源请求,给web服务器提供处理动态资源请求的服务。根据请求资源路径的后缀名进行判断:

如果请求资源路径的后缀名是.html则是动态资源请求, 让web框架程序进行处理。 否则是静态资源请求,让web服务器程序进行处理。

1.开发Web服务器主体程序

1、接受客户端HTTP请求(底层是TCP)

# -*- coding: utf-8 -*-# @File : My_Web_Server.py# @author: Flyme awei # @email : 1071505897@qq.com# @Time : 2022/7/24 21:28from socket import *import threading# 开发自己的Web服务器主类class MyHttpWebServer(object): def __init__(self, port): # 创建 HTTP服务的 TCP套接字 server_socket = socket(AF_INET, SOCK_STREAM) # 设置端口号互用,程序退出之后不需要等待,直接释放端口 server_socket.setsockopt(SOL_SOCKET, SO_REUSEADDR, True) # 绑定 ip和 port server_socket.bind(('', port)) # listen使套接字变为了被动连接 server_socket.listen(128) self.server_socket = server_socket # 处理请求函数 @staticmethod # 静态方法 def handle_browser_request(new_socket): # 接受客户端发来的数据 recv_data = new_socket.recv(4096) # 如果没有数据,那么请求无效,关闭套接字,直接退出 if len(recv_data) == 0: new_socket.close() return# 启动服务器,并接受客户端请求 def start(self): # 循环并多线程来接收客户端请求 while True: # accept等待客户端连接 new_socket, ip_port = self.server_socket.accept() print("客户端ip和端口", ip_port) # 一个客户端的请求交给一个线程来处理 sub_thread = threading.Thread(target=MyHttpWebServer.handle_browser_request, args=(new_socket, )) # 设置当前线程为守护线程 sub_thread.setDaemon(True) sub_thread.start() # 启动子线程# Web 服务器程序的入口def main(): web_server = MyHttpWebServer(8080) web_server.start()if __name__ == '__main__': main()

2、判断请求是否是静态资源还是动态资源

# 对接收的字节数据进行转换为字符数据 request_data = recv_data.decode('utf-8') print("浏览器请求的数据:", request_data) request_array = request_data.split(' ', maxsplit=2) # 得到请求路径 request_path = request_array[1] print("请求的路径是:", request_path) if request_path == "/": # 如果请求路径为根目录,自动设置为:/index.html request_path = "/index.html" # 判断是否为:.html 结尾 if request_path.endswith(".html"): "动态资源请求" pass else: "静态资源请求" pass

3、如果静态资源怎么处理?

"静态资源请求" # 根据请求路径读取/static 目录中的文件数据,相应给客户端 response_body = None # 响应主体 response_header = None # 响应头的第一行 response_first_line = None # 响应头内容 response_type = 'test/html' # 默认响应类型 try: # 读取 static目录中相对应的文件数据,rb模式是一种兼容模式,可以打开图片,也可以打开js with open('static'+request_path, 'rb') as f: response_body = f.read() if request_path.endswith('.jpg'): response_type = 'image/webp' response_first_line = 'HTTP/1.1 200 OK' response_header = 'Content-Length:' + str(len(response_body)) + '\r\n' + \ 'Content-Type: ' + response_type + '; charset=utf-8\r\n' + \ 'Date:' + time.strftime('%Y-%m-%d %H:%M:%S', time.localtime()) + '\r\n' + \ 'Server: Flyme awei Server\r\n' # 浏览器读取的文件可能不存在 except Exception as e: with open('static/404.html', 'rb') as f: response_body = f.read() # 响应的主体页面内容 # 响应头 response_first_line = 'HTTP/1.1 404 Not Found\r\n' response_header = 'Content-Length:'+str(len(response_body))+'\r\n' + \ 'Content-Type: text/html; charset=utf-8\r\n' + \ 'Date:' + time.strftime('%Y-%m-%d %H:%M:%S', time.localtime()) + '\r\n' + \ 'Server: Flyme awei Server\r\n' # 最后都会执行的代码 finally: # 组成响应数据发送给(客户端)浏览器 response = (response_first_line + response_header + '\r\n').encode('utf-8') + response_body new_socket.send(response) # 关闭套接字 new_socket.close()

静态资源请求验证:

4、如果动态资源又怎么处理

if request_path.endswith(".html"): "动态资源请求" # 动态资源的处理交给Web框架来处理,需要把请求参数交给Web框架,可能会有多个参数,采用字典结构 params = { 'request_path': request_path } # Web框架处理动态资源请求后,返回一个响应 response = MyFramework.handle_request(params) new_socket.send(response) new_socket.close()

5、关闭Web服务器

new_socket.close()

Web服务器主体框架总代码展示:

# -*- coding: utf-8 -*-# @File : My_Web_Server.py# @author: Flyme awei # @email : 1071505897@qq.com# @Time : 2022/7/24 21:28import sysimport timefrom socket import *import threadingimport MyFramework# 开发自己的Web服务器主类class MyHttpWebServer(object): def __init__(self, port): # 创建 HTTP服务的 TCP套接字 server_socket = socket(AF_INET, SOCK_STREAM) # 设置端口号互用,程序退出之后不需要等待,直接释放端口 server_socket.setsockopt(SOL_SOCKET, SO_REUSEADDR, True) # 绑定 ip和 port server_socket.bind(('', port)) # listen使套接字变为了被动连接 server_socket.listen(128) self.server_socket = server_socket # 处理请求函数 @staticmethod # 静态方法 def handle_browser_request(new_socket): # 接受客户端发来的数据 recv_data = new_socket.recv(4096) # 如果没有数据,那么请求无效,关闭套接字,直接退出 if len(recv_data) == 0: new_socket.close() return # 对接收的字节数据进行转换为字符数据 request_data = recv_data.decode('utf-8') print("浏览器请求的数据:", request_data) request_array = request_data.split(' ', maxsplit=2) # 得到请求路径 request_path = request_array[1] print("请求的路径是:", request_path) if request_path == "/": # 如果请求路径为根目录,自动设置为:/index.html request_path = "/index.html" # 判断是否为:.html 结尾 if request_path.endswith(".html"): "动态资源请求" # 动态资源的处理交给Web框架来处理,需要把请求参数交给Web框架,可能会有多个参数,采用字典结构 params = { 'request_path': request_path } # Web框架处理动态资源请求后,返回一个响应 response = MyFramework.handle_request(params) new_socket.send(response) new_socket.close() else: "静态资源请求" # 根据请求路径读取/static 目录中的文件数据,相应给客户端 response_body = None # 响应主体 response_header = None # 响应头的第一行 response_first_line = None # 响应头内容 response_type = 'test/html' # 默认响应类型 try: # 读取 static目录中相对应的文件数据,rb模式是一种兼容模式,可以打开图片,也可以打开js with open('static'+request_path, 'rb') as f: response_body = f.read() if request_path.endswith('.jpg'): response_type = 'image/webp' response_first_line = 'HTTP/1.1 200 OK' response_header = 'Content-Length:' + str(len(response_body)) + '\r\n' + \ 'Content-Type: ' + response_type + '; charset=utf-8\r\n' + \ 'Date:' + time.strftime('%Y-%m-%d %H:%M:%S', time.localtime()) + '\r\n' + \ 'Server: Flyme awei Server\r\n' # 浏览器读取的文件可能不存在 except Exception as e: with open('static/404.html', 'rb') as f: response_body = f.read() # 响应的主体页面内容 # 响应头 response_first_line = 'HTTP/1.1 404 Not Found\r\n' response_header = 'Content-Length:'+str(len(response_body))+'\r\n' + \ 'Content-Type: text/html; charset=utf-8\r\n' + \ 'Date:' + time.strftime('%Y-%m-%d %H:%M:%S', time.localtime()) + '\r\n' + \ 'Server: Flyme awei Server\r\n' # 最后都会执行的代码 finally: # 组成响应数据发送给(客户端)浏览器 response = (response_first_line + response_header + '\r\n').encode('utf-8') + response_body new_socket.send(response) # 关闭套接字 new_socket.close() # 启动服务器,并接受客户端请求 def start(self): # 循环并多线程来接收客户端请求 while True: # accept等待客户端连接 new_socket, ip_port = self.server_socket.accept() print("客户端ip和端口", ip_port) # 一个客户端的请求交给一个线程来处理 sub_thread = threading.Thread(target=MyHttpWebServer.handle_browser_request, args=(new_socket, )) # 设置当前线程为守护线程 sub_thread.setDaemon(True) sub_thread.start() # 启动子线程# Web 服务器程序的入口def main(): web_server = MyHttpWebServer(8080) web_server.start()if __name__ == '__main__': main()2.开发Web框架主体程序

1、根据请求路径,动态的响应对应的数据

# -*- coding: utf-8 -*-# @File : MyFramework.py# @author: Flyme awei # @email : 1071505897@qq.com# @Time : 2022/7/25 14:05import time# 自定义Web框架# 处理动态资源请求的函数def handle_request(parm): request_path = parm['request_path'] if request_path == '/index.html': # 当前请求路径有与之对应的动态响应,当前框架只开发了 index.html的功能 response = index() return response else: # 没有动态资源的数据,返回404页面 return page_not_found()# 当前 index函数,专门处理index.html的请求def index(): # 需求,在页面中动态显示当前系统时间 data = time.strftime('%Y-%m-%d %H:%M:%S', time.localtime()) response_body = data response_first_line = 'HTTP/1.1 200 OK\r\n' response_header = 'Content-Length:' + str(len(response_body)) + '\r\n' + \ 'Content-Type: text/html; charset=utf-8\r\n' + \ 'Date:' + time.strftime('%Y-%m-%d %H:%M:%S', time.localtime()) + '\r\n' + \ 'Server: Flyme awei Server\r\n' response = (response_first_line + response_header + '\r\n' + response_body).encode('utf-8') return responsedef page_not_found(): with open('static/404.html', 'rb') as f: response_body = f.read() # 响应的主体页面内容 # 响应头 response_first_line = 'HTTP/1.1 404 Not Found\r\n' response_header = 'Content-Length:' + str(len(response_body)) + '\r\n' + \ 'Content-Type: text/html; charset=utf-8\r\n' + \ 'Date:' + time.strftime('%Y-%m-%d %H:%M:%S', time.localtime()) + '\r\n' + \ 'Server: Flyme awei Server\r\n' response = (response_first_line + response_header + '\r\n').encode('utf-8') + response_body return responsePython开发自定义Web框架(python创建自定义函数)

2、如果请求路径,没有对应的响应数据也需要返回404页面

3.使用模板来展示响应内容

1、自己设计一个模板 index.html ,中有一些地方采用动态的数据来替代

<!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> <link href="/css/bootstrap.min.css" rel="stylesheet"> <script src="/js/jquery-1.12.4.min.js"></script> <script src="/js/bootstrap.min.js"></script></head><body><div class="navbar navbar-inverse navbar-static-top "> <div class="container"> <div class="navbar-header"> <button class="navbar-toggle" data-toggle="collapse" data-target="#mymenu"> <span class="icon-bar"></span> <span class="icon-bar"></span> <span class="icon-bar"></span> </button> <a href="#" class="navbar-brand">电影列表</a> </div> <div class="collapse navbar-collapse" id="mymenu"> <ul class="nav navbar-nav"> <li class="active"><a href="">电影信息</a></li> <li><a href="">个人中心</a></li> </ul> </div> </div></div><div class="container"> <div class="container-fluid"> <table class="table table-hover"> <tr> <th>序号</th> <th>名称</th> <th>导演</th> <th>上映时间</th> <th>票房</th> <th>电影时长</th> <th>类型</th> <th>备注</th> <th>删除电影</th> </tr> {%datas%} </table> </div></div></body></html>

2、怎么替代,替代什么数据

response_body = response_body.replace('{%datas%}', data)

4.开发框架的路由列表功能

1、以后开发新的动作资源的功能,只需要: a、增加一个条件判断分支 b、增加一个专门处理的函数

2、路由: 就是请求的URL路径和处理函数直接的映射。

3、路由表

请求路径处理函数/index.htmlindex函数/user_info.htmluser_info函数# 定义路由表route_list = { ('/index.html', index), ('/user_info.html', user_info)}for path, func in route_list: if request_path == path: return func() else: # 没有动态资源的数据,返回404页面 return page_not_found()

注意:用户的动态资源请求,通过遍历路由表找到对应的处理函数来完成的。

5.采用装饰器的方式添加路由

1、采用带参数的装饰器

# -*- coding: utf-8 -*-# @File : My_Web_Server.py# @author: Flyme awei # @email : 1071505897@qq.com# @Time : 2022/7/24 21:28# 定义路由表route_list = []# route_list = {# ('/index.html', index),# ('/user_info.html', user_info)# }# 定义一个带参数的装饰器def route(request_path): # 参数就是URL请求 def add_route(func): # 添加路由表 route_list.append((request_path, func)) @wraps(func) def invoke(*args, **kwargs): # 调用指定的处理函数,并返回结果 return func() return invoke return add_route# 处理动态资源请求的函数def handle_request(parm): request_path = parm['request_path'] # if request_path == '/index.html': # 当前请求路径有与之对应的动态响应,当前框架只开发了 index.html的功能 # response = index() # return response # elif request_path == '/user_info.html': # 个人中心的功能 # return user_info() # else: # # 没有动态资源的数据,返回404页面 # return page_not_found() for path, func in route_list: if request_path == path: return func() else: # 没有动态资源的数据,返回404页面 return page_not_found()

2、在任何一个处理函数的基础上增加一个添加路由的功能

@route('/user_info.html')

小结:使用带参数的装饰器,可以把我们的路由自动的,添加到路由表中。

6.电影列表页面的开发案例

1、查询数据 my_web.py

# -*- coding: utf-8 -*-# @File : My_Web_Server.py# @author: Flyme awei # @email : 1071505897@qq.com# @Time : 2022/7/24 21:28import socketimport sysimport threadingimport timeimport MyFramework# 开发自己的Web服务器主类class MyHttpWebServer(object): def __init__(self, port): # 创建HTTP服务器的套接字 server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # 设置端口号复用,程序退出之后不需要等待几分钟,直接释放端口 server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, True) server_socket.bind(('', port)) server_socket.listen(128) self.server_socket = server_socket # 处理浏览器请求的函数 @staticmethod def handle_browser_request(new_socket): # 接受客户端发送过来的数据 recv_data = new_socket.recv(4096) # 如果没有收到数据,那么请求无效,关闭套接字,直接退出 if len(recv_data) == 0: new_socket.close() return # 对接受的字节数据,转换成字符 request_data = recv_data.decode('utf-8') print("浏览器请求的数据:", request_data) request_array = request_data.split(' ', maxsplit=2) # 得到请求路径 request_path = request_array[1] print('请求路径是:', request_path) if request_path == '/': # 如果请求路径为跟目录,自动设置为/index.html request_path = '/index.html' # 根据请求路径来判断是否是动态资源还是静态资源 if request_path.endswith('.html'): '''动态资源的请求''' # 动态资源的处理交给Web框架来处理,需要把请求参数传给Web框架,可能会有多个参数,所有采用字典机构 params = { 'request_path': request_path, } # Web框架处理动态资源请求之后,返回一个响应 response = MyFramework.handle_request(params) new_socket.send(response) new_socket.close() else: '''静态资源的请求''' response_body = None # 响应主体 response_header = None # 响应头 response_first_line = None # 响应头的第一行 # 其实就是:根据请求路径读取/static目录中静态的文件数据,响应给客户端 try: # 读取static目录中对应的文件数据,rb模式:是一种兼容模式,可以打开图片,也可以打开js with open('static' + request_path, 'rb') as f: response_body = f.read() if request_path.endswith('.jpg'): response_type = 'image/webp' response_first_line = 'HTTP/1.1 200 OK' response_header = 'Server: Laoxiao_Server\r\n' except Exception as e: # 浏览器想读取的文件可能不存在 with open('static/404.html', 'rb') as f: response_body = f.read() # 响应的主体页面内容(字节) # 响应头 (字符数据) response_first_line = 'HTTP/1.1 404 Not Found\r\n' response_header = 'Server: Laoxiao_Server\r\n' finally: # 组成响应数据,发送给客户端(浏览器) response = (response_first_line + response_header + '\r\n').encode('utf-8') + response_body new_socket.send(response) new_socket.close() # 关闭套接字 # 启动服务器,并且接受客户端的请求 def start(self): # 循环并且多线程来接受客户端的请求 while True: new_socket, ip_port = self.server_socket.accept() print("客户端的ip和端口", ip_port) # 一个客户端请求交给一个线程来处理 sub_thread = threading.Thread(target=MyHttpWebServer.handle_browser_request, args=(new_socket,)) sub_thread.setDaemon(True) # 设置当前线程为守护线程 sub_thread.start() # 子线程要启动# web服务器程序的入口def main(): web_server = MyHttpWebServer(8080) web_server.start()if __name__ == '__main__': main()

MyFramework.py

# -*- coding: utf-8 -*-# @File : My_Web_Server.py# @author: Flyme awei # @email : 1071505897@qq.com# @Time : 2022/7/24 21:28import timefrom functools import wrapsimport pymysql# 定义路由表route_list = []# route_list = {# # ('/index.html',index),# # ('/userinfo.html',user_info)# }# 定义一个带参数装饰器def route(request_path): # 参数就是URL请求 def add_route(func): # 添加路由到路由表 route_list.append((request_path, func)) @wraps(func) def invoke(*arg, **kwargs): # 调用我们指定的处理函数,并且返回结果 return func() return invoke return add_route# 处理动态资源请求的函数def handle_request(params): request_path = params['request_path'] for path, func in route_list: if request_path == path: return func() else: # 没有动态资源的数据,返回404页面 return page_not_found() # if request_path =='/index.html': # 当前的请求路径有与之对应的动态响应,当前框架,我只开发了index.html的功能 # response = index() # return response # # elif request_path =='/userinfo.html': # 个人中心的功能,user_info.html # return user_info() # else: # # 没有动态资源的数据,返回404页面 # return page_not_found()# 当前user_info函数,专门处理userinfo.html的动态请求@route('/userinfo.html')def user_info(): # 需求:在页面中动态显示当前系统时间 date = time.strftime('%Y-%m-%d %H:%M:%S', time.localtime()) # response_body =data with open('template/user_info.html', 'r', encoding='utf-8') as f: response_body = f.read() response_body = response_body.replace('{%datas%}', date) response_first_line = 'HTTP/1.1 200 OK\r\n' response_header = 'Server: Laoxiao_Server\r\n' response = (response_first_line + response_header + '\r\n' + response_body).encode('utf-8') return response# 当前index函数,专门处理index.html的请求@route('/index.html')def index(): # 需求:从数据库中取得所有的电影数据,并且动态展示 # date = time.strftime('%Y-%m-%d %H:%M:%S', time.localtime()) # response_body =data # 1、从MySQL中查询数据 conn = pymysql.connect(host='localhost', port=3306, user='root', password='******', database='test', charset='utf8') cursor = conn.cursor() cursor.execute('select * from t_movies') result = cursor.fetchall() # print(result) datas = "" for row in result: datas += '''<tr> <td>%s</td> <td>%s</td> <td>%s</td> <td>%s</td> <td>%s 亿人民币</td> <td>%s</td> <td>%s</td> <td>%s</td> <td> <input type='button' value='删除'/> </td> </tr> ''' % row print(datas) # 把查询的数据,转换成动态内容 with open('template/index.html', 'r', encoding='utf-8') as f: response_body = f.read() response_body = response_body.replace('{%datas%}', datas) response_first_line = 'HTTP/1.1 200 OK\r\n' response_header = 'Server: Laoxiao_Server\r\n' response = (response_first_line + response_header + '\r\n' + response_body).encode('utf-8') return response# 处理没有找到对应的动态资源def page_not_found(): with open('static/404.html', 'rb') as f: response_body = f.read() # 响应的主体页面内容(字节) # 响应头 (字符数据) response_first_line = 'HTTP/1.1 404 Not Found\r\n' response_header = 'Server: Laoxiao_Server\r\n' response = (response_first_line + response_header + '\r\n').encode('utf-8') + response_body return response

2、根据查询的数据得到动态的内容

本文链接地址:https://www.jiuchutong.com/zhishi/298945.html 转载请保留说明!

上一篇:vue-router路由懒加载(vue router-view路由详解)

下一篇:如何运行vue项目(超详细图解)(运行vue项目的快捷键)

  • siri怎么使用默认音乐播放器(siri默认语音)

    siri怎么使用默认音乐播放器(siri默认语音)

  • vivoy30电池毫安是多少(vivoy30电量是多少)

    vivoy30电池毫安是多少(vivoy30电量是多少)

  • 支付宝怎么充值q币(支付宝怎么充值公交卡)

    支付宝怎么充值q币(支付宝怎么充值公交卡)

  • 苹果手机怎么空格到下一行(苹果手机怎么空调遥控)

    苹果手机怎么空格到下一行(苹果手机怎么空调遥控)

  • 微信不是群主怎么拉人进群(微信不是群主怎么艾特所有人)

    微信不是群主怎么拉人进群(微信不是群主怎么艾特所有人)

  • 华为mate30手机怎么插卡(华为mate30手机怎么连接电脑)

    华为mate30手机怎么插卡(华为mate30手机怎么连接电脑)

  • 状态函数有哪些性质(不属于状态函数有哪些)

    状态函数有哪些性质(不属于状态函数有哪些)

  • airpods白灯不闪烁(airpods白灯不闪烁但是没有连接提示)

    airpods白灯不闪烁(airpods白灯不闪烁但是没有连接提示)

  • bubal00a是什么型号(bub-al00a是什么型号)

    bubal00a是什么型号(bub-al00a是什么型号)

  • 锂电池短路后能恢复吗(锂电池短路后能充电吗)

    锂电池短路后能恢复吗(锂电池短路后能充电吗)

  • 抖音门店和小店的区别(抖音门店和小店哪个好)

    抖音门店和小店的区别(抖音门店和小店哪个好)

  • 对方挂断电话有什么提示(对方挂断电话我电话还在响)

    对方挂断电话有什么提示(对方挂断电话我电话还在响)

  • 抖音播放量多少以下算是限流(抖音播放量多少进入下一个流量池)

    抖音播放量多少以下算是限流(抖音播放量多少进入下一个流量池)

  • 淘宝消息撤回对方还能看到吗(淘宝消息 撤回)

    淘宝消息撤回对方还能看到吗(淘宝消息 撤回)

  • 蓝牙耳机只能打电话不能听歌(蓝牙耳机只能打电话不能听歌怎么弄)

    蓝牙耳机只能打电话不能听歌(蓝牙耳机只能打电话不能听歌怎么弄)

  • soul如何知道对方在线(soul如何知道对方是男是女)

    soul如何知道对方在线(soul如何知道对方是男是女)

  • usb hard disk什么意思(usb hard disk是固态硬盘吗)

    usb hard disk什么意思(usb hard disk是固态硬盘吗)

  • 打字下划线怎么打出来(打字下划线怎么消失)

    打字下划线怎么打出来(打字下划线怎么消失)

  • 淘宝人生胡子怎么去除(淘宝人生 胡子)

    淘宝人生胡子怎么去除(淘宝人生 胡子)

  • 京东可以不收货直接退回吗(京东不收货商家能收到钱吗)

    京东可以不收货直接退回吗(京东不收货商家能收到钱吗)

  • 荣耀v20怎么打开后台(荣耀v20怎么打开红外功能)

    荣耀v20怎么打开后台(荣耀v20怎么打开红外功能)

  • 笔记本电脑怎么加内存(笔记本电脑怎么录屏幕视频带声音)

    笔记本电脑怎么加内存(笔记本电脑怎么录屏幕视频带声音)

  • 手机qq怎么注销账号(手机QQ怎么注销邮箱)

    手机qq怎么注销账号(手机QQ怎么注销邮箱)

  • iphone 11是双卡双待吗(iphone11是双卡双待怎么插卡)

    iphone 11是双卡双待吗(iphone11是双卡双待怎么插卡)

  • 贡献芝麻粒有什么用(贡献芝麻粒有什么影响)

    贡献芝麻粒有什么用(贡献芝麻粒有什么影响)

  • a1674ipad哪年产的(苹果平板a1674是几代)

    a1674ipad哪年产的(苹果平板a1674是几代)

  • pr如何提取纯净人声(pr如何提取纯净人声视频教程)

    pr如何提取纯净人声(pr如何提取纯净人声视频教程)

  • 微信如何批量删除好友(微信如何批量删除聊天记录)

    微信如何批量删除好友(微信如何批量删除聊天记录)

  • 苹果7p打电话对方听不清楚(苹果7p打电话对方听不见什么原因)

    苹果7p打电话对方听不清楚(苹果7p打电话对方听不见什么原因)

  • 取消共享文件夹账号密码教程(win7取消共享文件夹)

    取消共享文件夹账号密码教程(win7取消共享文件夹)

  • 税务局开票需要交钱吗
  • 库存盘盈盘亏要调整吗
  • 财务如何审核合同支付条款风险
  • 洗车费怎么做会计分录
  • 收到加工费普通发票怎么做账务处理
  • 跨期列支成本费用危害
  • 民间非营利组织算企业吗
  • 怎么理解捐赠支出税前扣除标准计算口径
  • 成本法下的后续计量
  • 固定资产进项可以抵扣的时间
  • 税金及附加里面有印花税吗
  • 如何网上认证发票流程
  • 申报截止日期前还能用吗
  • 未认证进项税额转出
  • 工会经费电子税务局找不见了
  • 购买材料,材料未验收入库,货款未付会计分录
  • 房产评估增值部门有哪些
  • 多计提的费用怎么调整
  • 免税销售额对应的进项税额
  • 公司双方签订协议书范本
  • 公司终止的时间是进行注销登记生效后
  • 发票已认证次月冲红
  • 建筑测量水准仪怎么读数
  • 财产租赁所得个人所得税怎么申报
  • 厂区地面硬化的意义
  • 股东退股资金如何返还
  • 如何关闭开始菜单快捷键
  • 国税0申报如何网上申报
  • 溢价对外投资账务处理
  • 高新技术企业加计5%
  • lsalss.exe
  • php语言之面向对象编程 educoder
  • 发票开出后只收到部分款怎么处理?
  • 不能抵扣的发票可以做成本吗
  • 什么是两免一补的条件
  • 企业所得税季度预缴是什么意思
  • 做毕业设计,前景如何
  • php判断链表是否有环
  • 电子发票手动导出到哪
  • 土地增值税扣除率怎样计算
  • 垃圾处理费计入办公费用吗
  • 出差费用计入
  • pandas columns排序
  • datatable怎么用
  • 企业所得税A类年报怎么申报
  • 已执行新金融准则 本期金额
  • 企业出售自用房产开具增值税
  • 玉米收购厂
  • 购入固定资产怎么抵扣企业所得税
  • 应纳税调增调减科目是什么
  • 业务招待费比例控制规定
  • 营改增有什么好处
  • 购买原材料无法准确划分用途的进项税额怎么抵扣
  • 收到上月已付款的材料
  • 自创商誉是否需要纳税
  • 赠送客户样品记什么费用
  • 主营业务税金及附加借贷方向
  • 会计凭证负数金额怎么算
  • 整个期间影响损耗的因素
  • 食品企业生产成本管理的案例分析
  • 生产成本如何设置明细账
  • mysql 5.7.12 winx64手动安装教程
  • win10免费安装吗
  • 苹果电脑dock栏是什么意思
  • solaris修改ip地址
  • xp系统如何添加启动项
  • win7系统共享打印机设置方法
  • 笔记本拔掉硬盘开机没反应
  • fpassist.exe是什么进程 有什么作用 fpassist进程查询
  • 快速掌握阅读题的技巧
  • 一键配置天赋的台词
  • jquery插件库怎么导入
  • nodejs利用http模块实现银行卡所属银行查询和骚扰电话验证示例
  • shell中判断文件是否存在
  • angular form表单
  • 河北税务云办税厅官方
  • 发票税额小数点打印不全能报销吗
  • 青海税务app怎么开票
  • 江苏大丰属哪个市
  • 税务稽查会打电话吗
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设